Set

 功能:

  1. 一个容器,一个“大筐”

 

知识摘要:

  1. Set不允许存在重复数据,判断重复标准:equals方法
  2. HashSet:hashCode值决定它在HashSet中的位置
  3. LinkedHashSet:HashSet子类,以链表的方式维护元素的次序
  4. TreeSet:SortedSet接口的实现类,它保持了排序状态
  5. EnumSet:性能相对不错的 枚举Set(本例未涉及相关内容,有兴趣可以自己查看相关API)
  6. HashSet、TreeSet、EnumSet都是线程不安全的 
    如果需要线程安全使用: 
    Set s = Collections.synchronizedSet(new HashSet(...));

 

程序演示: 放大

  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 @ www.cxyapi.com 
  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. }  

你可能感兴趣的:(set)