2023-02-28 關(guān)于集合中的有序性(sort)和穩(wěn)定性(order)以及其他內(nèi)容

首先

1、有序性是和SortedSet有關(guān)的,實(shí)現(xiàn)這個(gè)SortedSet接口即可(常見NavigableSet,是SortedSet的子類)

? ? ?有序性是指遍歷的結(jié)果是按某種比較規(guī)則依次排列的。說白了就是元素之間使用compare比較

2、穩(wěn)定性主要是和AbstractCollection有關(guān)的,間接或者直接實(shí)現(xiàn)這個(gè)抽象類即可(為什么說主要?因?yàn)楦鷋ashcode的實(shí)現(xiàn)也有關(guān))

? ??穩(wěn)定性是指集合每次遍歷的元素次序是一定的。寫入的時(shí)候是什么順序?qū)懭耄瑃oString的時(shí)候就是什么順序讀出(其實(shí)就是關(guān)鍵在toString這里,toString使用的就是AbstractCollection的toString)

Map<K,V> 典型的實(shí)現(xiàn)就是HashMap,它并沒有實(shí)現(xiàn)以上兩個(gè)接口或者抽象類,所以是無序且不穩(wěn)定的,但是TreeMap是有序的,因?yàn)樗鼘?shí)現(xiàn)了NavigableSet

Set<T>的去重原理其實(shí)就是使用的HashMap,put的時(shí)候是K,V(V這個(gè)是固定的object),所以Set集合維護(hù)起來就是一個(gè)去重了的集合。大部分的Set子類都實(shí)現(xiàn)了AbstractSet(AbstractCollection的子類之一),所以是具有穩(wěn)定性的。

上面提到穩(wěn)定性跟hashCode有關(guān)

舉個(gè)例子

HashSet和HashMap都是無序的,HashSet的底層實(shí)現(xiàn)其實(shí)也是HashMap(點(diǎn)擊HashSet構(gòu)造方法即可得知)。即便HashSet也是繼承了AbstractCollection,因?yàn)镠ashSet和HashMap插入后都會(huì)自動(dòng)排序,意思是因?yàn)閷懭氲臅r(shí)候它自動(dòng)排序了導(dǎo)致取值的時(shí)候跟寫入的時(shí)候順序不一樣了(具體算法就沒研究了)

而LinkedHashSet是有序的,LinkedHashSet的底層實(shí)現(xiàn)是LinkedHashMap!(點(diǎn)擊LinkedHashSet構(gòu)造方法即可得知)。而LinkedHashMap重寫了相關(guān)的方法如Entry的靜態(tài)內(nèi)部類等所以實(shí)現(xiàn)了有序。

圖為LinkedHashMap對一些關(guān)鍵方法的重載

來實(shí)現(xiàn)底層的寫入保持了有序性

a.jpg


加一個(gè)執(zhí)行結(jié)果的圖


b.jpg

所有的寫入順序都是1,2,4,3??梢园l(fā)現(xiàn)LinkedHashSet和linkedHashMap保持了有序性,HashMap和HashSet都自動(dòng)排序了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Collection接口 Collection接口是所有集合的祖先類。他有兩個(gè)構(gòu)造方法,一個(gè)無參構(gòu)造,一個(gè)是帶Co...
    夜幕繁華閱讀 682評(píng)論 0 0
  • 集合系列(一):集合框架概述 Java 集合是 Java API 用得最頻繁的一類,掌握 Java 集合的原理以及...
    陳樹義閱讀 386評(píng)論 0 0
  • 01. 摘要 Set集合的特點(diǎn)主要有:元素不重復(fù)、存儲(chǔ)無序的特點(diǎn)。 打開 Set 集合,主要實(shí)現(xiàn)類有 HashSe...
    chen_chen_chen_閱讀 312評(píng)論 0 0
  • Java集合框架 Java中封裝了許多常用的數(shù)據(jù)結(jié)構(gòu),稱為集合框架,可以有效組織數(shù)據(jù),提高程序性能。最初Java只...
    Steven1997閱讀 1,097評(píng)論 0 2
  • 一. 集合類帶來的好處 降低編程難度:在編程中會(huì)經(jīng)常需要鏈表、向量等集合類,如果自己動(dòng)手寫代碼實(shí)現(xiàn)這些類,需要花費(fèi)...
    cyw1227閱讀 623評(píng)論 0 0

友情鏈接更多精彩內(nèi)容