首先
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)底層的寫入保持了有序性

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

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