java--集合-Set(一)
一、set接口簡介
- Set是Collection子接口;
- Set和Collection基本上一樣,一點除外:
- Set無法記住添加的順序,不允許包含重複的元素。
- 當試圖添加兩個相同元素進Set集合,添加操作失敗,add()方法返回false。
- Set判斷兩個對象是否相等用equals,而不是使用==。
- 也就是說兩個對象equals比較返回true,Set集合是不會接受這個兩個對象的。
- 常用子類:
HashSet:散列存放
TreeSet:有序存放
二、HashCode方法對於HashSet的作用
- HashSet類是Set接口最常用的實現類,採用hash算法存儲數據,具有良好的存儲和查找功能。
散列存儲:不記錄添加順序;排列順序時,順序有可能發生變化;
線程不安全的,多個線程訪問一個HashSet要使用同步代碼;
HashSet集合元素值允許是null,但是最多隻能有一個;
- hash(翻譯爲哈希,或散列)算法的功能:
保證通過一個對象快速找到另一個對象;
其算法價值體現在速度,可以保證查詢快速執行;
當從HashSet中訪問元素時,HashSet先計算該元素的hashCode(也就是該對象的hashCode方法返回值),然後直接到該HashCode對應的位置取出該元素;
在這裏對象的hashCode就好比是數組裏的索引,但是不是索引;
三、HashSet元素添加
- 當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,判斷已經存儲在集合中的對象的hashCode值是否與添加的對象的hashCode值一致:若不一致:直接添加進去;若一致,再進行equals方法比較,equals方法如果返回true,表明對象已經添加進去了,就不會再添加新的對象了,否則添加進去;
- 如果我們重寫了equals方法,也要重寫hashCode方法,反之亦然;。
- HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,並且兩個對象的hashCode方法返回值也相等。
- 如果需要某個類的對象保存到HashSet集合中,覆寫該類的equals()和hashCode()方法,應該儘量保證兩個對象通過equals比較返回true時,他們的hashCode返回也相等。
四、HashSet元素添加實例
HashSet添加元素:
Set set = new HashSet();
set.add("Lucy");
先調用"Lucy".hashCode(),判斷set集合裏是否已經有了"Lucy".hashCode():
1.不存在: 就直接把Lucy添加到set集合;
2.存在: 再比較"Lucy"和與"Lucy"一樣Hashcode值的對象,使用對象的equals比較;
false: 就添加進set
true: 表明是一個對象,add(Object e),就返回false,添加失敗
五、TreeSet概述
- 使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序;
參與排序的元素必須是同一類型的,不然會發生ClassCastException異常;
參與排序的元素必須是同一類型的報錯實例
set.add("春哥"); set.add("鳳姐"); set.add("S"); set.add("A"); set.add("s"); set.add("a"); set.add("1"); set.add(2); //添加類型和上面的類型不一致,會報錯ClassCastException
- TreeSet是SortedSet接口唯一的實現,與HashSet相比額外的方法有:
Comparator comparator():返回當前Set使用的Comparator,若返回null,表示以自然順序排序。
Object first() 返回此 set 中當前第一個(最低)元素。
Object last() 返回此 set 中當前最後一個(最高)元素。
SortedSet subSet(Object fromElement, E toElement) 返回此 set 的部子集,其元素從 fromElement(包括)到 toElement(不包括)。
SortedSet headSet(Object toElement)返回此 set 的部分子集,其元素嚴格小於 toElement。
SortedSet tailSet(Object fromElement) 返回此 set 的部分子集,其元素大於等於 fromElement。
六、TreeSet的排序之自然排序
- TreeSet會調用元素的compareTo(Object o)方法來比較元素之間的大小關係,然後將集合裏的元素按升序排列.此時需要排序元素的類必須實現Compareble接口,並覆寫其int compareTo(Object o)方法;
該方法用於比較對象,若:obj1,compareTo(obj2),返回0,表示兩個對象相等,若返回一個正整數,表示obj1大於obj2,若返回一個負整數,表示obj1小於obj2;
- 對於TreeSet集合而言,判斷兩個對象相等的標準是:
compareTo()方法比較返回 0;
七、TreeSet的排序之定製排序
- TreeSet的自然排序是根據元素的大小進行升序排序的,若想自己定製排序,比如降序排序,就可以使用Comparator接口了:
該接口包含int compare(Object o1,Object o2)方法,用於比較兩個對象的大小,比較結果和compareTo方法一致;
- 要實現定製排序,需要在創建TreeSet集合對象時,提供一個一個Comparator對象,該對象裏負責集合元素的排序邏輯;
TreeSet(Comparator comparator)