JAVA基础 之 Set

来源:互联网 发布:js设置div属性 编辑:程序博客网 时间:2024/06/05 10:32

概述:

    1.Set不允许重复数据,判断重复标准:equals方法

    2.HashSet 

       1.无序,允许存在null

       2.hashCode值决定它在HashSet中的位置,通过hashCode值算出存储位置

       3.判断重复标准:equals方法 和 hashCode方法 同时相等

             a.如果equals相同,hashCode不同,两个相同值的对象存在不同的位置(原因见第二点)

             b.如果hashCode相同,equals不同,采用链式结构将2个对象存在同一位置(桶的概念,bucket),这会导致性能下降

       4.两个概念初始容量 和 加载因子(hashSet尚未爆仓(只需达到初始容量*加载因子,即16*0.75),系统会动态扩大容量)

       5.没有实现线程同步 如果需要同步操作(多线程安全)请使用

 

Java代码 复制代码 收藏代码
  1. Set s = Collections.synchronizedSet(new HashSet(...));  

       6.迭代过程中必须使用迭代器自身的remove方法删除数据,否则会出异常

    3.LinkedHashSet

       1.他是HashSet子类。

       2.它以链表的方式维护元素的次序,所以它会按照添加顺序访问集合中的对象。

       3.顺序遍历的时候性能比HashSet好,但是其他涉及到元素位置变化的操作性能就不如HashSet了。(数据结构知识)

       4.虽然它有一定的访问顺序,但是它和List还是有区别的,最明显的一点:它仍然不能有重复对象。

    4.TreeSet

       1.SortedSet接口的实现类,它保持了排序状态。

       2.方法:第一个、前一个、后一个、最后一个、范围截取、小于某元素、大于或者等于某元素

       3.采用红黑树的数据结构来存储数据

       4.支持2种排序方式:自然排序 和 定制排序

          1.自然排序

             a.调用Comparable接口的compareTo方法进行比较

             由于需要排序,进入TreeSet的对象需要是同一个类的实例,否则在比较的时候会出现类转化异常。

           2.定制排序

              实现Comparator接口(见例子)

       5.如果碰到不能排序的对象加入到TreeSet中 会出现异常(见例子)

    5.EnumSet

       1.性能相对不错的 枚举Set

       2.不多讲,有兴趣可以看看api

    6.HashSet、TreeSet、EnumSet都是线程不安全的

 

PS:

    1.Set不仅仅如此,这里只做基本的阐述,更加详细的请参见 JAVA API

    2.初学者挑能看懂的看吧,基础的操作其实还是比较简单的

 

Java代码 复制代码 收藏代码
  1. package com.cxy.collection;   
  2.   
  3. import java.util.Comparator;   
  4. import java.util.HashSet;   
  5. import java.util.LinkedHashSet;   
  6. import java.util.Set;   
  7. import java.util.TreeSet;   
  8.   
  9. /**  
  10.  * @author cxy  
  11.  */  
  12. public class SetTest   
  13. {   
  14.     public static void main(String[] args)   
  15.     {   
  16.         Set s = new HashSet();   
  17.         s.add(null);   
  18.         s.add(new A());   
  19.         s.add(new A());   
  20.         //由于2个A对象的hashCode返回的都是1,并且equals方法返回的是true,所以这两个对象只能存在1个  
  21.         s.add(new B());   
  22.         s.add(new B());   
  23.         //B对象的equals方法返回的永远是false,所以这两个B对象都能留下  
  24.         s.add(new C());   
  25.         s.add(new C());   
  26.         //2个C对象hashCode返回的都是2,并且equals方法返回的是true,并且hashCode没有和以往对象相等的,所以留住1个C对象  
  27.         System.out.println(s); //通过打印结果可以看出 HashSet无序性。  
  28.            
  29.         LinkedHashSet<String> lhs = new LinkedHashSet<String>();   
  30.         lhs.add("world");   
  31.         lhs.add("said");   
  32.         lhs.add("hello");   
  33.         System.out.println(lhs);  //按照加入顺序打印  
  34.            
  35.         TreeSet ts=new TreeSet();   
  36.         ts.add(100);   
  37.         ts.add(64);   
  38.         ts.add(-100);   
  39.         ts.add(0);   
  40.         System.out.println(ts);  //发现打印出来的已然是有序状态  
  41.         System.out.println("第一个:"+ts.first());    
  42.         System.out.println("最后一个:"+ts.last());    
  43.         System.out.println("小于64的最大元素(64前面的):"+ts.lower(64));     
  44.         System.out.println("大于0的最小元素(0后面的):"+ts.higher(0));     
  45.         System.out.println("0~100之间的:"+ts.subSet(0100));  //半闭半开区间  
  46.         System.out.println("小于64的集合"+ts.headSet(64));   
  47.         System.out.println("大于或者等于0的集合"+ts.tailSet(0));   
  48.            
  49.         try  
  50.         {   
  51.             TreeSet errorSet=new TreeSet();   
  52.             errorSet.add(new error());   
  53.             errorSet.add(new error());   
  54.         }catch(Exception e)   
  55.         {   
  56.             System.out.println("由于error类没有实现Comparable接口的compareTo方法,所以这里出现类型转换的异常");   
  57.         }   
  58.            
  59.         try  
  60.         {   
  61.             TreeSet errorSet1=new TreeSet();   
  62.             errorSet1.add(123);   
  63.             errorSet1.add("asd");   
  64.         }catch(Exception e)   
  65.         {   
  66.             System.out.println("不同类实例的比较 会出类转换异常");   
  67.         }   
  68.            
  69.         //一个定制排序的set   
  70.         TreeSet myStyleSet=new TreeSet(new Comparator()   
  71.         {   
  72.             @Override  
  73.             public int compare(Object o1, Object o2)   
  74.             {   
  75.                 return 0;  //一个永远平等的集合~ 你懂的~  
  76.             }   
  77.                
  78.         });     
  79.     }   
  80. }   
  81.   
  82. class A   
  83. {   
  84.     @Override  
  85.     public int hashCode()   
  86.     {   
  87.         return 1;   
  88.     }   
  89.        
  90.     @Override  
  91.     public boolean equals(Object obj)   
  92.     {   
  93.         return true;   
  94.     }   
  95. }   
  96.   
  97. class B   
  98. {   
  99.     @Override  
  100.     public int hashCode()   
  101.     {   
  102.         return 1;   
  103.     }   
  104.        
  105.     @Override  
  106.     public boolean equals(Object obj)   
  107.     {   
  108.         return false;   
  109.     }   
  110. }   
  111.   
  112. class C   
  113. {   
  114.     @Override  
  115.     public int hashCode()   
  116.     {   
  117.         return 2;   
  118.     }   
  119.        
  120.     @Override  
  121.     public boolean equals(Object obj)   
  122.     {   
  123.         return true;   
  124.     }   
  125. }   
  126.   
  127. //一个没有实现比较的类   
  128. class error   
  129. {   
  130.        
  131. }