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

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

    java集合Set接口

    Set接口Set接口是Collection的子接口,set接口沒(méi)有提供額外的方法。

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

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

    Set的常用實(shí)現(xiàn)類有:HashSetTreeSet、LinkedHashSet。

    HashSet1、概述

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

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

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

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

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

    HashSet 具有以下特點(diǎn):

    不能保證元素的排列順序

    HashSet 不是線程安全的

    集合元素可以有一個(gè)是 null

    java集合Set接口

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

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

    2、hashCode和equals方法

    重寫equals()方法的原則:

    對(duì)稱性:如果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),永遠(yuǎn)返回是“false”;x.equals(和x不同類型的對(duì)象)永遠(yuǎn)返回是“false”。

    重寫 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 值

    LinkedHashSetLinkedHashSet 是 HashSet 的子類

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

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

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

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

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

    1、自然排序

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

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

    因?yàn)橹挥邢嗤惖膬蓚€(gè)實(shí)例才會(huì)比較大小,所以向 TreeSet 中添加的應(yīng)該是同一個(gè)類的對(duì)象

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

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

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

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

    Character:按字符的 unicode值來(lái)進(jìn)行比較

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

    String:按字符串中字符的 unicode 值進(jìn)行比較

    Date、Time:后邊的時(shí)間、日期比前面的時(shí)間、日期大

    2、定制排序

    TreeSet的自然排序是根據(jù)集合元素的大小,進(jìn)行元素升序排列。如果需要定制排序,比如降序排列,可通過(guò)Comparator接口的幫助。需要重寫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)造器。

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

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

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

    3、結(jié)論

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

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

    3.TreeSet的自然排序是根據(jù)集合元素的大小,進(jìn)行元素升序排列。如果需要定制排序,比如降序排列,可以將實(shí)現(xiàn)Comparator接口的實(shí)例作為形參傳遞給TreeSet的構(gòu)造器,那么添加元素時(shí),將調(diào)用compare(T o1,T o2)方法作為排序依據(jù)。同時(shí)也應(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),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年5月8日 19:35
    下一篇 2022年5月8日 20:05

    聯(lián)系我們

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