Set接口
Set接口是Collection的子接口,set接口沒(méi)有提供額外的方法
Set 集合不允許包含相同的元素,如果試把兩個(gè)相同的元素加入同一個(gè)Set 集合中,則添加操作失敗。
Set 判斷兩個(gè)對(duì)象是否相同不是使用 == 運(yùn)算符,而是根據(jù) equals() 方法
Set實(shí)現(xiàn)類(lèi)之一:HashSet
HashSet 是 Set 接口的典型實(shí)現(xiàn),大多數(shù)時(shí)候使用 Set 集合時(shí)都使用這個(gè)實(shí)現(xiàn)類(lèi)。
HashSet 按 Hash 算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存取、查找、刪除性能。
HashSet 具有以下特點(diǎn):
- 不能保證元素的排列順序
- HashSet 不是線程安全的
- 集合元素可以是 null
HashSet 集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn):兩個(gè)對(duì)象通過(guò) hashCode() 方法比較相等,并且兩個(gè)對(duì)象的 equals() 方法返回值也相等。
對(duì)于存放在Set容器中的對(duì)象,對(duì)應(yīng)的類(lèi)一定要重寫(xiě)equals()和hashCode(Object obj)方法,以實(shí)現(xiàn)對(duì)象相等規(guī)則。即:“相等的對(duì)象必須具有相等的散列碼”。
重寫(xiě) hashCode() 方法的基本原則:
- 在程序運(yùn)行時(shí),同一個(gè)對(duì)象多次調(diào)用 hashCode() 方法應(yīng)該返回相同的值。
- 當(dāng)兩個(gè)對(duì)象的 equals() 方法比較返回 true 時(shí),這兩個(gè)對(duì)象的 hashCode()方法的返回值也應(yīng)相等。
- 對(duì)象中用作 equals() 方法比較的 Field,都應(yīng)該用來(lái)計(jì)算 hashCode 值。
重寫(xiě) equals() 方法的基本原則:
復(fù)寫(xiě)equals方法的時(shí)候一般都需要同時(shí)復(fù)寫(xiě)hashCode方法。通常參與計(jì)算hashCode的對(duì)象的屬性也應(yīng)該參與到equals()中進(jìn)行計(jì)算。
Set實(shí)現(xiàn)類(lèi)之二:LinkedHashSet
- LinkedHashSet 是 HashSet 的子類(lèi)
- LinkedHashSet 根據(jù)元素的 hashCode 值來(lái)決定元素的存儲(chǔ)位置,但它同時(shí)使用雙向鏈表維護(hù)元素的次序,這使得元素看起來(lái)是以插入順序保存的。
- LinkedHashSet插入性能略低于 HashSet,但在迭代訪問(wèn) Set 里的全部元素時(shí)有很好的性能。
- LinkedHashSet 不允許集合元素重復(fù)。
Set實(shí)現(xiàn)類(lèi)之三:TreeSet
TreeSet 是 SortedSet 接口的實(shí)現(xiàn)類(lèi),TreeSet 可以確保集合元素處于排序狀態(tài)。
TreeSet底層使用紅黑樹(shù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)
TreeSet 兩種排序方法:自然排序和定制排序。默認(rèn)情況下,TreeSet 采用自然排序。
- 自然排序:TreeSet 會(huì)調(diào)用集合元素的 compareTo(Object obj) 方法來(lái)比較元素之間的大小關(guān)系,然后將集合元素按升序(默認(rèn)情況)排列
- 如果試圖把一個(gè)對(duì)象添加到 TreeSet 時(shí),則該對(duì)象的類(lèi)必須實(shí)現(xiàn) Comparable接口。
自然排序
- 向 TreeSet 中添加元素時(shí),只有第一個(gè)元素?zé)o須比較compareTo()方法,后面添加的所有元素都會(huì)調(diào)用compareTo()方法進(jìn)行比較。
- 因?yàn)橹挥邢嗤?lèi)的兩個(gè)實(shí)例才會(huì)比較大小,所以向 TreeSet 中添加的應(yīng)該是同一個(gè)類(lèi)的對(duì)象。
- 對(duì)于 TreeSet 集合而言,它判斷兩個(gè)對(duì)象是否相等的唯一標(biāo)準(zhǔn)是:兩個(gè)對(duì)象通過(guò) compareTo(Object obj) 方法比較返回值。
- 當(dāng)需要把一個(gè)對(duì)象放入 TreeSet 中,重寫(xiě)該對(duì)象對(duì)應(yīng)的 equals() 方法時(shí),應(yīng)保證該方法與 compareTo(Object obj) 方法有一致的結(jié)果:如果兩個(gè)對(duì)象通過(guò)equals() 方法比較返回 true,則通過(guò) compareTo(Object obj) 方法比較應(yīng)返回 0。否則,讓人難以理解。
定制排序
- 不希望按照升序(默認(rèn)情況)的方式排列元素或希望按照其它屬性大小進(jìn)行排序,則考慮使用定制排序。定制排序,通過(guò)Comparator接口來(lái)實(shí)現(xiàn)。需要重寫(xiě)compare(T o1,T o2)方法。
- 利用int compare(T o1,T o2)方法,比較o1和o2的大?。喝绻椒ǚ祷卣麛?shù),則表示o1大于o2;如果返回0,表示相等;返回負(fù)整數(shù),表示o1小于o2。
- 要實(shí)現(xiàn)定制排序,需要將實(shí)現(xiàn)Comparator接口的實(shí)例作為形參傳遞給TreeSet的構(gòu)造器。
- 使用定制排序判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是:通過(guò)Comparator比較兩個(gè)元素返回了0。