淺談Java中的LinkedHashSet哈希鏈表
HashSet哈希鏈表
Map、Set集合存放是無序的,然而LinkedHashSet和LinkedHashMap等集合卻有序
原因:LinkedHashSet與LinkedHashMap底層是通過雙向鏈表來實現(xiàn)排序的。
雙向鏈表里面的數(shù)據(jù)在邏輯上的存儲是連續(xù)的,連續(xù)自然也就有順序。
有序的原因關鍵在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ù)結構。正式因為這個鏈表才保證了LinkedHashMap的有序性。
LinkedHashSet集合也是根據(jù)元素hashCode值來決定元素存儲位置,但它同時使用鏈表維護元素的次序,這樣使得元素看起來是以插入的順序保存的。
也就是說,當遍歷LinkedHashSet集合里元素時,HashSet將會按元素的添加順序來訪問集合里的元素,因此LinkedHashSet可以保證元素按插入順序輸出。
而Set對每個對象只接受一次,里面的值不允許重復,是無序的數(shù)據(jù)結構;
LinkeHashSet是set集合的一個實現(xiàn),具有set集合不重復的特點,同時具有可預測的迭代順序,即輸入順序。
這種雙鏈表的結構一條用于儲存元素,一條用于記錄順序。
而Map Set集合內是單鏈表或稀疏數(shù)組,各元素之間并沒有維持一條總的鏈表結構,所以Map和Set是無序的
LinkedHashSet的4種構造函數(shù):
- 第一種構造函數(shù)初始化一個空的LinkedHashSet: LinkedHashSet( );
- 第二種構造函數(shù)使用Collection元素集初始化LinkedHashSet: LinkedHashSet(Collection c);
- 第三種構造函數(shù)用給定的容量初始化LinkedHashSet: LinkedHashSet(int capacity);
- 第四種構造函數(shù)通過傳入的容量和填充比初始化LinkedHashSet: LinkedHashSet(int capacity, float fillRatio);

運行結果:

這兩斷代碼我們可以得出:LinkedHashSet 底層采用雙向鏈表實現(xiàn),可以保證元素的插入順序,又因為是HashSet的子類,所以插入的元素不能重復。
到此這篇關于淺談Java中的LinkedHashSet哈希鏈表的文章就介紹到這了,更多相關Java的LinkedHashSet內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目中使用Swagger2及注解解釋的詳細教程
Swagger2是一個開源項目,用于為RESTful Web服務生成REST API文檔,下面這篇文章主要給大家介紹了關于SpringBoot項目中使用Swagger2及注解解釋的詳細教程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04
從零搭建Spring Boot腳手架整合OSS作為文件服務器的詳細教程
這篇文章主要介紹了從零搭建Spring Boot腳手架整合OSS作為文件服務器的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Java多線程CyclicBarrier的實現(xiàn)代碼
CyclicBarrier可以使一定數(shù)量的線程反復地在柵欄位置處匯集,本文通過實例代碼介紹下Java多線程CyclicBarrier的相關知識,感興趣的朋友一起看看吧2022-02-02
Spring中的ClassPathXmlApplicationContext源碼詳解
這篇文章主要介紹了Spring中的ClassPathXmlApplicationContext源碼詳解,ApplicationContext的主要實現(xiàn)類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默認從類路徑加載配置文件,后者默認從文件系統(tǒng)中裝載配置文件,需要的朋友可以參考下2023-12-12

