概述:

    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.没有实现线程同步 如果需要同步操作(多线程安全)请使用

 

1. Set s = Collections.synchronizedSet(new


       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.初学者挑能看懂的看吧,基础的操作其实还是比较简单的

 

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