`
JaHunter
  • 浏览: 89732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

set相关

    博客分类:
  • java
阅读更多
ArrayList 允许快速随机存取,相比于LinkedList不适合拿来进行元素安插和移除操作。
LinkedList 提供最佳循序存取,适合安插和移除元素,随机存取操作比ArrayList缓慢。
HashSet 只存放唯一值,是把搜寻时间看得很重要,用hash方式作set,故Access time complexity = O(1)
TreeSet 同上,但是存入的元素都会经过排序,所以速度比HashSet慢一点
LinkedHashSet 此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。
 
Set 无序的,不可以重复元素 
 |--HashSet: 底层数据结构是哈希表, 线程不同步 
         hashSet是如何保证元素唯一性呢? 
          是通过元素的两个方法, hashCode 和  equals 来完成的  
          如果元素的hashCode值相同,才会判断equals 是否为true 
          如果元素的hashCode值不同,不会调用 equals. 
           
          注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法. 
             
 |--TreeSet: 可以对Set集合中的元素进行排序 
             底层数据结构式是二叉树 
             compareTo 方法 return 0  TreeSet 中就只会有一个 元素 
 
如果我们自己定义的一个类的对象要加入到TreeSet当中,那么这个类必须要实现Comparable接口。
 
/**
 * testTreeSet1自然排序 testTreeSet2自定义排序
*/
public class TreeSetTest {
 
       public static void main(String[] args) {
            TreeSetTest tst = new TreeSetTest();
            tst.testTreeSet1();
            tst.testTreeSet2();
      }
      
       public void testTreeSet1() {
             Set set1 = new TreeSet();
             set1.add( new BigDecimal( "3")) ;
             set1.add( new BigDecimal( "5")) ;
             set1.add( new BigDecimal( "1")) ;
             set1.add( new BigDecimal( "9")) ;
            
             //会报错java. lang.String cannot be cast to java.math.BigDecimal
             //set1.add("1");
            
            for (Iterator it = set1.iterator(); it.hasNext();) {
                  System. out .println(it.next());
            }
             //output:1  3  5  9
      }
      
       public void testTreeSet2() {
             Set set1 = new TreeSet();
             set1.add( new Customer( "Tom", 20)) ;
             set1.add( new Customer( "Petter" , 22));
             set1.add( new Customer( "Mike" , 19));
             set1.add( new Customer( "Tom", 21)) ;
 
             for (Iterator it = set1.iterator(); it.hasNext();) {
                  System. out .println(it.next());
            }
             //output:
             //Mike 19
             //Petter 22
             //Tom 20
             //Tom 21
      }
 
      //注:要实现equals,hashCode方法
       class Customer implements Comparable{
             public String name ;
             public int age ;
             public Customer(String name, int age) {
                   this .name = name;
                   this .age = age;
            }
             @Override
             public String toString() {
                   return this .name " " + this .age ;
            }
            
             @Override
             public boolean equals(Object obj) {
                   if (this == obj) return true ;
                   if (!(obj instanceof Customer)) return false ;
                  Customer other = (Customer)obj;
                   if (this .name .equals(other. name) && this .age == other.age ) {
                         return true ;
                  } else {
                         return false ;
                  }
            }
            
             @Override
             public int hashCode() {
                  
                  int result;
                  result = ( name == null ? 0 : name.hashCode());
                  result = 29 * result + age ;
                  return result;
            }
            
             @Override
             public int compareTo(Object o) {
 
                  Customer other = (Customer)o;
                   //先按name属性排序(如果想按倒序排序,则将下面依次改成返回-1/1)
                   if (this .name .compareTo(other. name) > 0) return 1;
                   if (this .name .compareTo(other. name) < 0) return -1;
                  
                   //再按age属性排序
                   if (this .age > other. agereturn 1;
                   if (this .age < other. agereturn -1;
                  
                   return 0;
            }
      }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics