set能用for循環(huán)遍歷嗎 Java遍歷HashSet時(shí),為什么輸出是有序的?
Java遍歷HashSet時(shí),為什么輸出是有序的?首先,上面是hash的類描述,表示hash可以是無(wú)序的,也可以是有序的。問(wèn)一下會(huì)是什么樣子,讓我們看看HashSet的源代碼實(shí)現(xiàn)。HashSet的底層
Java遍歷HashSet時(shí),為什么輸出是有序的?
首先,上面是hash的類描述,表示hash可以是無(wú)序的,也可以是有序的。問(wèn)一下會(huì)是什么樣子,讓我們看看HashSet的源代碼實(shí)現(xiàn)。
HashSet的底層由具有空鍵的HashMap存儲(chǔ)。
HashMap的數(shù)據(jù)結(jié)構(gòu)是table[entry],這是一個(gè)鏈表結(jié)構(gòu),每個(gè)數(shù)據(jù)元素都是一個(gè)鏈表。具有相同hashcode的不同鍵將落在表[hashcode]的鏈表上。
但是當(dāng)HashMap存儲(chǔ)值時(shí),它將根據(jù)密鑰的hashcode()計(jì)算存儲(chǔ)位置(該位置是散列的,所以它是無(wú)序的);
它感覺(jué)是有序的,因?yàn)閔ashcode()不重復(fù)。樣品太少的原因
1。Linkedhashset是從hahsset繼承的。構(gòu)造方法使用HashSet的三個(gè)參數(shù)調(diào)用該方法。此構(gòu)造方法的底層將初始化LinkedHashMap。因?yàn)長(zhǎng)inkedHashMap是有序的,所以linkedhashset也是有序的。為什么我們不能調(diào)用這個(gè)構(gòu)造函數(shù)?它是包訪問(wèn)級(jí)別,不能在外部調(diào)用。接下來(lái),分析LinkedHashMap是如何實(shí)現(xiàn)的,以理解為什么它是有序的。
2. 先看下面的圖片。(對(duì)于寫在手機(jī)上的問(wèn)題,你不能把圖片放在文字里,它們都在下面。)。
LinkedHashMap的數(shù)據(jù)結(jié)構(gòu)與HashMap不同。HashMap中的條目有四個(gè)屬性:key、value、hash和next,而LinkedHashMap中的條目添加了before和after屬性。因此,LinkedHashMap在HashMap的基礎(chǔ)上使用雙向鏈表來(lái)連接所有節(jié)點(diǎn)。當(dāng)然,它也有一個(gè)頭部節(jié)點(diǎn),所以遍歷可以有序進(jìn)行。具體結(jié)構(gòu)如圖所示。
3. LinkedHashMap主要重寫addentry和createentry方法,在創(chuàng)建節(jié)點(diǎn)時(shí)創(chuàng)建雙向鏈表。
此外,LinkedHashMap還可以實(shí)現(xiàn)LRU算法的緩存。
源代碼基于JDK7查看ha。如果你不懂HashMap,你可以看到我分享的另一篇文章。
希望對(duì)您有所幫助,您可以關(guān)注我,以后會(huì)分享更多的架構(gòu)和java知識(shí)文章。