Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一種,迭代器。
|--HashSet:底層數據結構是哈希表,線程是不同步的。無序,高效;
HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。
當元素的hashCode值相同時,才繼續判斷元素的equals是否為true。
如果為true,那么視為相同元素,不存。如果為false,那么存儲。
如果hashCode值不同,那么不判斷equals,從而提高對象比較的速度。
|--LinkedHashSet:有序,hashset的子類。
|--TreeSet:對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的數據結構就是二叉樹。
哈希表的原理:
1,對對象元素中的關鍵字(對象中的特有數據),進行哈希算法的運算,并得出一個具體的算法值,這個值 稱為哈希值。
2,哈希值就是這個元素的位置。
3,如果哈希值出現沖突,再次判斷這個關鍵字對應的對象是否相同。如果對象相同,就不存儲,因為元素重復。如果對象不同,就存儲,在原來對象的哈希值基礎 +1順延。
4,存儲哈希值的結構,我們稱為哈希表。
5,既然哈希表是根據哈希值存儲的,為了提高效率,最好保證對象的關鍵字是唯一的。
這樣可以盡量少的判斷關鍵字對應的對象是否相同,提高了哈希表的操作效率。
對于ArrayList集合,判斷元素是否存在,或者刪元素底層依據都是equals方法。
對于HashSet集合,判斷元素是否存在,或者刪除元素,底層依據的是hashCode方法和equals方法。
本文版權歸黑馬程序員Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓學院
首發:http://java.itheima.com/