欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解LinkedHashSet集合的底層機制

 更新時間:2023年10月30日 08:30:45   作者:荊軻刺秦  
這篇文章主要介紹了LinkedHashSet的底層機制詳解,LinkedHashSet根據(jù)元素的hashCode值來決定元素的存儲位置,同時使用鏈表維護元素的次序,?這使得元素看起來是以插入順序保存的,需要的朋友可以參考下

LinkedHashSet 能夠維護元素插入集合的順序,在遍歷時,按照此順序進行遍歷。

LinkedHashSet 繼承了 HashSet 類,實現(xiàn)了 Set 等接口。LinkedHashSet 仍然支持 null 元素,唯一有所區(qū)別的是在迭代時,它能夠按照元素的插入順序遍歷。

LinkedHashSet 的實現(xiàn)非常簡單,它僅僅只重新實現(xiàn)了構造方法,將 HashSet 內(nèi)部維護的 HashMap 對象變?yōu)榱?LinkedHashMap 對象。

	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);
    }

不難發(fā)現(xiàn),這里僅僅調(diào)用了父類的同一個構造方法,查看父類的該構造方法:

	HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

這里至少有三點,我們可以注意到:

訪問控制修飾符為默認,也就是說 我們并不能直接通過該構造函數(shù)創(chuàng)建 HashSet 對象實例,否則創(chuàng)建出來的對象實例就是有序(插入順序)的了。同時,也能看出,我們繼承 HashSet 也無法獲得該構造函數(shù);如果想要實現(xiàn)自己的HashSet,并且具有有序這一特性,應該考慮從 LinkedHashSet 繼承。dummy 參數(shù),該參數(shù)的作用是為了區(qū)分方法簽名,因為 HashSet 已經(jīng)存在 HashSet(int,float) 這樣的構造函數(shù)了。內(nèi)部維護的 HashMap 實例變?yōu)榱?LinkedHashMap 對象的實例。

所以,LinkedHashSet 的有序性是將父類內(nèi)部維護的 HashMap 實例更換為 LinkedHashMap 實例實現(xiàn)的,它并不需要重寫任何其它的方法。

還有個值得注意的問題,LinkedHashMap 是支持兩種排序的,一種是 插入排序(也就是現(xiàn)在這種),一種是訪問排序(構造函數(shù)中設置 accessOrder 為 true);

既然知道了它的實現(xiàn)原理也不難理解為什么它能夠按插入順序進行迭代了,因為它完全復用了 LinkedHashMap的部分功能。

我們知道通過迭代器遍歷是可以按插入順序,那么通過 forEach 方法或者 Java 的 增強 for 循環(huán)能否有序呢?其實這兩種方法本質(zhì)上都與 java.lang.Iterable 接口有關,Collection 接口實現(xiàn)了這個接口,該接口提供了返回迭代器的方法,所以歸根結(jié)底,這兩種方法也可以算迭代器遍歷。 HashSet 實現(xiàn)了 Iterable 接口的方法,返回指定 HashMap 對象實例的迭代器,所以在使用 LinkedHashSet 的 forEach 方法或者增強 for 循環(huán)時,仍然能夠按插入順序遍歷。

forEach 是Iterable接口的默認方法,默認實現(xiàn)使用了增強 for 循環(huán);增強 for 循環(huán)還可用于數(shù)組。

到此這篇關于深入理解LinkedHashSet集合的底層機制的文章就介紹到這了,更多相關LinkedHashSet底層機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 通過jstack分析解決進程死鎖問題實例代碼

    通過jstack分析解決進程死鎖問題實例代碼

    這篇文章主要介紹了通過jstack分析解決進程死鎖問題實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java中的字節(jié)流InputStream和OutputStream詳解

    Java中的字節(jié)流InputStream和OutputStream詳解

    這篇文章主要介紹了Java中的字節(jié)流InputStream和OutputStream詳解,繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)8bit,我們看到的具體的某一些管道,凡是以InputStream結(jié)尾的管道,都是以字節(jié)的形式向我們的程序輸入數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • Java pdf和jpg互轉(zhuǎn)案例

    Java pdf和jpg互轉(zhuǎn)案例

    這篇文章主要介紹了Java pdf和jpg互轉(zhuǎn)案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringMVC請求流程源碼解析

    SpringMVC請求流程源碼解析

    這篇文章主要介紹了SpringMVC請求流程源碼分析,包括springmvc使用,SpringMVC啟動過程及SpringMVC請求過程,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • idea中的Maven導包失敗問題解決方案匯總

    idea中的Maven導包失敗問題解決方案匯總

    這篇文章主要介紹了idea中的Maven導包失敗問題解決總結(jié),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 利用Java查看進程內(nèi)存占用情況的實現(xiàn)方法

    利用Java查看進程內(nèi)存占用情況的實現(xiàn)方法

    在系統(tǒng)監(jiān)控和性能調(diào)優(yōu)中,了解各個進程的內(nèi)存占用情況是非常重要的一環(huán),通過查看進程內(nèi)存使用情況,開發(fā)者和運維人員可以及時發(fā)現(xiàn)異常進程、資源瓶頸和內(nèi)存泄漏問題,本項目旨在使用 Java 編寫一個簡單的程序,通過調(diào)用操作系統(tǒng)的命令來獲取系統(tǒng)中各個進程的內(nèi)存使用情況
    2025-03-03
  • SpringBoot項目運行jar包啟動的步驟流程解析

    SpringBoot項目運行jar包啟動的步驟流程解析

    這篇文章主要介紹了SpringBoot項目運行jar包啟動的步驟流程,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-07-07
  • java 實現(xiàn)定時的方法及實例代碼

    java 實現(xiàn)定時的方法及實例代碼

    這篇文章主要介紹了java 定時任務詳細介紹及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • 集合框架(Collections Framework)詳解及代碼示例

    集合框架(Collections Framework)詳解及代碼示例

    這篇文章主要介紹了集合框架(Collections Framework)詳解及代碼示例,文章涉及集合數(shù)組的區(qū)別,collection接口,iterator迭代器,list接口及其用法,LinkedHashSet集合等有關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 淺談使用Java Web獲取客戶端真實IP的方法示例詳解

    淺談使用Java Web獲取客戶端真實IP的方法示例詳解

    這篇文章主要介紹了使用Java-Web獲取客戶端真實IP的方法示例詳解。一般我們無法獲取客戶端真實IP,原因是:當我們通過request獲取客戶端IP時,自身服務器通常會為了保護信息或者負載均衡的目的,對自身服務器做反向代理。對此感興趣可以了解一下
    2020-07-07

最新評論