super net LinkdHashSet底層怎么實(shí)現(xiàn)元素有序?
LinkdHashSet底層怎么實(shí)現(xiàn)元素有序?1. Linkedhashset繼承自hahsset。構(gòu)造方法使用三個(gè)參數(shù)調(diào)用方法。構(gòu)造方法的底層初始化LinkedHashMap。因?yàn)長(zhǎng)inkedHas
LinkdHashSet底層怎么實(shí)現(xiàn)元素有序?
1. Linkedhashset繼承自hahsset。構(gòu)造方法使用三個(gè)參數(shù)調(diào)用方法。構(gòu)造方法的底層初始化LinkedHashMap。因?yàn)長(zhǎng)inkedHashMap是有序的,所以linkedhashset也是有序的。為什么我們不能調(diào)用這個(gè)構(gòu)造函數(shù)?它是包訪問級(jí)別,不能在外部調(diào)用。接下來,分析LinkedHashMap是如何實(shí)現(xiàn)的,以理解為什么它是有序的。
2. 先看下面的圖片。(對(duì)于寫在手機(jī)上的問題,你不能把圖片放在文字里,它們都在下面。)。
LinkedHashMap的數(shù)據(jù)結(jié)構(gòu)與HashMap不同。HashMap中的條目有四個(gè)屬性:key、value、hash和next,而LinkedHashMap中的條目添加了before和after屬性。因此,LinkedHashMap在HashMap的基礎(chǔ)上使用雙向鏈表來連接所有節(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í)文章。
HashMap和HashSet的區(qū)別?
1. HashSet的底層由HashMap實(shí)現(xiàn)。HashSet的實(shí)現(xiàn)相對(duì)簡(jiǎn)單。HashSet的大多數(shù)方法都是通過調(diào)用HashMap的方法來實(shí)現(xiàn)的。因此,HashSet和HashMap的實(shí)現(xiàn)本質(zhì)上是相同的。
2. HashMap的鍵是放入HashSet的對(duì)象,值是對(duì)象類型。
3. 在調(diào)用HashSet的add方法時(shí),一行(鍵值對(duì))實(shí)際上被添加到HashMap中。行的鍵是添加到HashSet的對(duì)象,行的值是object type的常量
集下有HashSet和TreeSet
HashSet顧名思義是哈希表結(jié)構(gòu)
TreeSet是樹結(jié)構(gòu)
1。樹集采用二叉差分樹實(shí)現(xiàn)。樹集中的數(shù)據(jù)自動(dòng)排序,不允許空值。
2. 哈希集由哈希表實(shí)現(xiàn)。HashSet中的數(shù)據(jù)是無序的,可以放入null,但只能放入一個(gè)null。兩者中的值不能重復(fù),就像數(shù)據(jù)庫中的唯一約束一樣。
3. HashSet要求要放置的對(duì)象必須實(shí)現(xiàn)hashcode()方法。要放置的對(duì)象由hashcode標(biāo)識(shí)。對(duì)于具有相同內(nèi)容的字符串對(duì)象,hashcode是相同的,因此要放置的內(nèi)容不能重復(fù)。但是,同一類的對(duì)象可以放置在不同的實(shí)例中。