淺談Java中的LinkedHashSet哈希鏈表
HashSet哈希鏈表
Map、Set集合存放是無序的,然而LinkedHashSet和LinkedHashMap等集合卻有序
原因:LinkedHashSet與LinkedHashMap底層是通過雙向鏈表來實現(xiàn)排序的。
雙向鏈表里面的數(shù)據(jù)在邏輯上的存儲是連續(xù)的,連續(xù)自然也就有順序。
有序的原因關(guān)鍵在LinkedHashMap的Node 節(jié)點上。
LinkedHashMap 繼承自HashMap 并且實現(xiàn)了Map接口。
源碼如下:
/** HashMap.Node subclass for normal LinkedHashMap entries. */ static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
可以看到LinkedHashMap.Entry 繼承自HashMap.Node 除了Node 本身有的幾個屬性外,額外增加了before after 用于指向前一個Entry 后一個Entry。
也就是說,元素之間維持著一條總的鏈表數(shù)據(jù)結(jié)構(gòu)。正式因為這個鏈表才保證了LinkedHashMap的有序性。
LinkedHashSet集合也是根據(jù)元素hashCode值來決定元素存儲位置,但它同時使用鏈表維護元素的次序,這樣使得元素看起來是以插入的順序保存的。
也就是說,當遍歷LinkedHashSet集合里元素時,HashSet將會按元素的添加順序來訪問集合里的元素,因此LinkedHashSet可以保證元素按插入順序輸出。
而Set對每個對象只接受一次,里面的值不允許重復(fù),是無序的數(shù)據(jù)結(jié)構(gòu);
LinkeHashSet是set集合的一個實現(xiàn),具有set集合不重復(fù)的特點,同時具有可預(yù)測的迭代順序,即輸入順序。
這種雙鏈表的結(jié)構(gòu)一條用于儲存元素,一條用于記錄順序。
而Map Set集合內(nèi)是單鏈表或稀疏數(shù)組,各元素之間并沒有維持一條總的鏈表結(jié)構(gòu),所以Map和Set是無序的
LinkedHashSet的4種構(gòu)造函數(shù):
- 第一種構(gòu)造函數(shù)初始化一個空的LinkedHashSet: LinkedHashSet( );
- 第二種構(gòu)造函數(shù)使用Collection元素集初始化LinkedHashSet: LinkedHashSet(Collection c);
- 第三種構(gòu)造函數(shù)用給定的容量初始化LinkedHashSet: LinkedHashSet(int capacity);
- 第四種構(gòu)造函數(shù)通過傳入的容量和填充比初始化LinkedHashSet: LinkedHashSet(int capacity, float fillRatio);
運行結(jié)果:
這兩斷代碼我們可以得出:LinkedHashSet 底層采用雙向鏈表實現(xiàn),可以保證元素的插入順序,又因為是HashSet的子類,所以插入的元素不能重復(fù)。
到此這篇關(guān)于淺談Java中的LinkedHashSet哈希鏈表的文章就介紹到這了,更多相關(guān)Java的LinkedHashSet內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析
這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Spring復(fù)雜對象創(chuàng)建的方式小結(jié)
這篇文章主要介紹了Spring復(fù)雜對象創(chuàng)建的三種方式,現(xiàn)在使用Spring如何創(chuàng)建這種類型的對象?Spring中提供了三種方法來創(chuàng)建復(fù)雜對象,需要的朋友可以參考下2022-01-01SpringBoot項目中使用Swagger2及注解解釋的詳細教程
Swagger2是一個開源項目,用于為RESTful Web服務(wù)生成REST API文檔,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項目中使用Swagger2及注解解釋的詳細教程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細教程
這篇文章主要介紹了從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java多線程CyclicBarrier的實現(xiàn)代碼
CyclicBarrier可以使一定數(shù)量的線程反復(fù)地在柵欄位置處匯集,本文通過實例代碼介紹下Java多線程CyclicBarrier的相關(guān)知識,感興趣的朋友一起看看吧2022-02-02Spring中的ClassPathXmlApplicationContext源碼詳解
這篇文章主要介紹了Spring中的ClassPathXmlApplicationContext源碼詳解,ApplicationContext的主要實現(xiàn)類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默認從類路徑加載配置文件,后者默認從文件系統(tǒng)中裝載配置文件,需要的朋友可以參考下2023-12-12