在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    java集合Set接口

    Set接口Set接口是Collection的子接口,set接口沒有提供額外的方法。

    Set 集合不允許包含相同的元素,如果試把兩個相同的元素加入同一個 Set 集合中,則添加操作失敗。

    Set 判斷兩個對象是否相同不是使用 == 運算符,而是根據(jù) equals 方法。因此存放到Set集合中的元素一定要注意equals方法的重寫。

    Set的常用實現(xiàn)類有:HashSet、TreeSet、LinkedHashSet。

    HashSet1、概述

    HashSet 是 Set 接口的典型實現(xiàn),大多數(shù)時候使用 Set 集合時都使用這個實現(xiàn)類。

    HashSet 按 Hash 算法來存儲集合中的元素,因此具有很好的存取和查找性能。

    HashSet 集合判斷兩個元素相等的標(biāo)準:兩個對象通過 hashCode() 方法比較相等,并且兩個對象的 equals() 方法返回值也相等。

    當(dāng)向 HashSet 集合中存入一個元素時,HashSet 會調(diào)用該對象的 hashCode() 方法來得到該對象的 hashCode 值,然后根據(jù) hashCode 值,通過某種散列函數(shù)決定該對象在 HashSet 中的存儲位置。(這個散列函數(shù)會與底層數(shù)組的長度相計算得到在數(shù)組中的下標(biāo),并且這種散列函數(shù)計算還盡可能保證能均勻存儲元素,越是散列分布,該散列函數(shù)設(shè)計的越好)

    如果兩個元素的hashCode()值相等,會再繼續(xù)調(diào)用equals方法,如果equals方法結(jié)果為true,添加失敗,如果為false,那么會保存該元素,但是該數(shù)組的位置已經(jīng)有元素了,那么會通過鏈表的方式繼續(xù)鏈接。

    HashSet 具有以下特點:

    不能保證元素的排列順序

    HashSet 不是線程安全的

    集合元素可以有一個是 null

    java集合Set接口

    底層也是數(shù)組,初始容量為16,當(dāng)如果使用率超過0.75,(16*0.75=12)就會擴大容量為原來的2倍。(16擴容為32,依次為64,128….等)

    結(jié)論:存放到Set集合中的元素一定要注意equals和hashcode方法的重寫。

    2、hashCode和equals方法

    重寫equals()方法的原則:

    對稱性:如果x.equals(y)返回是“true”,那么y.equals(x)也應(yīng)該返回是“true”。

    自反性:x.equals(x)必須返回是“true”。

    類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也應(yīng)該返回是“true”。

    一致性:如果x.equals(y)返回是“true”,只要x和y內(nèi)容一直不變,不管你重復(fù)x.equals(y)多少次,返回都是“true”。

    任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。

    重寫 hashCode() 方法的基本原則

    在程序運行時,同一個對象多次調(diào)用 hashCode() 方法應(yīng)該返回相同的值

    當(dāng)兩個對象的 equals() 方法比較返回 true 時,這兩個對象的 hashCode() 方法的返回值也應(yīng)相等

    對象中用作 equals() 方法比較的屬性Field,都應(yīng)該用來計算 hashCode 值

    LinkedHashSetLinkedHashSet 是 HashSet 的子類

    LinkedHashSet 根據(jù)元素的 hashCode 值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序,這使得元素看起來是以插入順序保存的。

    LinkedHashSet插入性能略低于 HashSet,但在迭代訪問 Set 里的全部元素時有很好的性能。

    LinkedHashSet 不允許集合元素重復(fù)。

    TreeSetTreeSet 是 SortedSet 接口的實現(xiàn)類,TreeSet 可以確保集合元素處于排序狀態(tài)。

    TreeSet 兩種排序方法:自然排序和定制排序。默認情況下,TreeSet 采用自然排序。

    1、自然排序

    TreeSet 會調(diào)用集合元素的 compareTo(Object obj) 方法來比較元素之間的大小關(guān)系,然后將集合元素按升序排列,如果試圖把一個對象添加到 TreeSet 時,則該對象的類必須實現(xiàn) Comparable 接口。實現(xiàn) Comparable 的類必須實現(xiàn) compareTo(Object obj) 方法,兩個對象即通過 compareTo(Object obj) 方法的返回值來比較大小。

    向 TreeSet 中添加元素時,只有第一個元素?zé)o須比較compareTo()方法,后面添加的所有元素都會調(diào)用compareTo()方法進行比較。

    因為只有相同類的兩個實例才會比較大小,所以向 TreeSet 中添加的應(yīng)該是同一個類的對象

    對于 TreeSet 集合而言,它判斷兩個對象是否相等的唯一標(biāo)準是:兩個對象通過 compareTo(Object obj) 方法比較返回值

    當(dāng)需要把一個對象放入 TreeSet 中,重寫該對象對應(yīng)的 equals() 方法時,應(yīng)保證該方法與 compareTo(Object obj) 方法有一致的結(jié)果:如果兩個對象通過 equals() 方法比較返回 true,則通過 compareTo(Object obj) 方法比較應(yīng)返回 0。否則讓人難以理解。

    Comparable 的典型實現(xiàn):

    BigDecimal、BigInteger 以及所有的數(shù)值型對應(yīng)的包裝類:按它們對應(yīng)的數(shù)值大小進行比較

    Character:按字符的 unicode值來進行比較

    Boolean:true 對應(yīng)的包裝類實例大于 false 對應(yīng)的包裝類實例

    String:按字符串中字符的 unicode 值進行比較

    Date、Time:后邊的時間、日期比前面的時間、日期大

    2、定制排序

    TreeSet的自然排序是根據(jù)集合元素的大小,進行元素升序排列。如果需要定制排序,比如降序排列,可通過Comparator接口的幫助。需要重寫compare(T o1,T o2)方法。利用int compare(T o1,T o2)方法,比較o1和o2的大?。喝绻椒ǚ祷卣麛?shù),則表示o1大于o2;如果返回0,表示相等;返回負整數(shù),表示o1小于o2。

    要實現(xiàn)定制排序,需要將實現(xiàn)Comparator接口的實例作為形參傳遞給TreeSet的構(gòu)造器。

    此時,仍然只能向TreeSet中添加類型相同的對象。否則發(fā)生ClassCastException異常。

    使用定制排序判斷兩個元素相等的標(biāo)準是:通過Comparator比較兩個元素返回了0。

    當(dāng)使用具有與 equals 不一致的強行排序能力的 Comparator 對有序 set(或有序映射)進行排序時,應(yīng)該小心謹慎。假定一個帶顯式 Comparator c 的有序 set(或有序映射)與從 set S 中抽取出來的元素(或鍵)一起使用。如果 c 強行對 S 進行的排序是與 equals 不一致的,那么有序 set(或有序映射)將是行為“怪異的”。

    3、結(jié)論

    1.放到TreeSet集合中的元素必須是同一個類型的元素

    2.放到TreeSet集合中的元素必須實現(xiàn)Comparable接口,重寫compareTo(Object obj)方法,并且需要使得equals方法的與compareTo方法結(jié)果一直,即如果兩個對象通過 equals() 方法比較返回 true,則通過 compareTo(Object obj) 方法比較應(yīng)返回 0。

    3.TreeSet的自然排序是根據(jù)集合元素的大小,進行元素升序排列。如果需要定制排序,比如降序排列,可以將實現(xiàn)Comparator接口的實例作為形參傳遞給TreeSet的構(gòu)造器,那么添加元素時,將調(diào)用compare(T o1,T o2)方法作為排序依據(jù)。同時也應(yīng)該注意equals方法與compare(T o1,T o2)方法的結(jié)果一致。

    相關(guān)文章:

    java集合的遍歷

    java集合List接口

    java集合Collection接口

    java之?dāng)?shù)據(jù)格式化

    Java異常處理的概述

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    (0)
    用戶投稿
    上一篇 2022年5月8日 19:35
    下一篇 2022年5月8日 20:05

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息