Java中的LinkedHashSet集合解讀
LinkedHashSet介紹
LinkedHashSet是一個(gè)基于LinkedHashMap實(shí)現(xiàn)的有序去重集合列表。
- LinkedHashSet中的元素沒有重復(fù)
- LinkedHashSet中的元素有順序,維護(hù)了添加順序
- LInkedHashSet可以存儲(chǔ)null值
- LinkedHashSet是一個(gè)線程不安全的容器
以上是LinkedHashSet的類結(jié)構(gòu)圖:
- 繼承了HashSet,所以它是在HashSet的基礎(chǔ)上維護(hù)了元素添加順序的功能
構(gòu)造方法
LinkedHashSet()
說明: 創(chuàng)建一個(gè)空的容器列表,默認(rèn)的初始容量為16,負(fù)載因子為0.75
LinkedHashSet(int initialCapacity, float loadFactor)
說明:創(chuàng)建一個(gè)指定初始容量和負(fù)載因子的容器
關(guān)鍵方法
public boolean add(E e)
說明:向集合中添加元素
public boolean remove(Object o)
說明:向集合中刪除元素
public void clear()
說明:清空集合元素
public int size()
說明:返回集合中元素的數(shù)量
使用案例
驗(yàn)證LinkedHashSet的順序性
@Test public void test1() { Set<Integer> set = new LinkedHashSet<>(); set.add(5); set.add(4); set.add(5); set.add(3); set.add(1); set.add(9); //正順序遍歷 System.out.print("遍歷:"); set.forEach(item -> { System.out.print(item + " "); }); }
運(yùn)行結(jié)果:
驗(yàn)證LinkedHashSet存儲(chǔ)null值
@Test public void test2() { Set<Integer> set = new LinkedHashSet<>(); set.add(null); set.add(5); System.out.println(set); }
運(yùn)行結(jié)果:
核心機(jī)制
底層有序性實(shí)現(xiàn)機(jī)制
LinkedHashSet底層是一個(gè) LinkedHashMap,底層維護(hù)了一個(gè)數(shù)組+雙向鏈表。
它根據(jù)元素的hashCode值來決定元素的存儲(chǔ)位置,同時(shí)使用鏈表維護(hù)元素的次序, 這使得元素看起來是以插入順序保存的。
源碼解析
本文主要從源碼角度看下LinkedhashSet確實(shí)是依賴于LinkedHashMap,具體的邏輯還是要關(guān)注LinkedHashMap的實(shí)現(xiàn)。
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable { public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); } public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); } public LinkedHashSet() { super(16, .75f, true); } public LinkedHashSet(Collection<? extends E> c) { super(Math.max(2*c.size(), 11), .75f, true); addAll(c); } }
LinkedHashSet繼承于HashSet,它的源碼很少,只有幾個(gè)構(gòu)造函數(shù),基本上都是調(diào)用父類HashSet的構(gòu)造函數(shù)。
查看父類的構(gòu)造函數(shù),它是一個(gè)非public的構(gòu)造函數(shù),創(chuàng)建了一個(gè)LinkedHashMap, 所以說是依賴于LinkedHashMap實(shí)現(xiàn)的。
總結(jié)
LinkedHashSet主要適用于對(duì)于元素的添加順序讀取有要求的場(chǎng)景,比如FIFO這樣的場(chǎng)景。
至于性能方面,大家也不用太過于擔(dān)心,LinkedHashSet插入性能略低于HashSet,但在迭代訪問set里面的全部元素時(shí)有很好的性能。
到此這篇關(guān)于Java中的LinkedHashSet集合解讀的文章就介紹到這了,更多相關(guān)Java的LinkedHashSet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot通過Redis實(shí)現(xiàn)防止重復(fù)提交
表單提交是一個(gè)非常常見的功能,如果不加控制,容易因?yàn)橛脩舻恼`操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請(qǐng)求被發(fā)送多次,本文主要介紹了Spring Boot通過Redis實(shí)現(xiàn)防止重復(fù)提交,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06Springboot項(xiàng)目javax.validation使用方法詳解
這篇文章主要介紹了Springboot項(xiàng)目javax.validation使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java使用條件語句和循環(huán)結(jié)構(gòu)確定控制流(實(shí)例)
下面小編就為大家?guī)硪黄狫ava使用條件語句和循環(huán)結(jié)構(gòu)確定控制流(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別
BigDecimal類有多個(gè)方法可以將其轉(zhuǎn)換為字符串,其中包括toString()和toPlainString(),本文主要介紹了Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識(shí)字的示例代碼
圖片中的文字提取已經(jīng)越來越多地應(yīng)用于數(shù)據(jù)輸入和自動(dòng)化處理過程,本文主要介紹了SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識(shí)字的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06通過xml配置SpringMVC注解DispatcherServlet初始化過程解析
這篇文章主要為大家介紹了通過xml配置SpringMVC注解DispatcherServlet初始化過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10JAVALambda表達(dá)式與函數(shù)式接口詳解
大家好,本篇文章主要講的是JAVALambda表達(dá)式與函數(shù)式接口詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02解決Idea運(yùn)行junit測(cè)試時(shí)報(bào)Error:[3,17]?程序包org.junit不存在的問題
這篇文章主要介紹了Idea運(yùn)行junit測(cè)試時(shí)報(bào)Error:[3,17]?程序包org.junit不存在解決方法,本文給大家分享兩種解決辦法,需要的朋友可以參考下2023-03-03