最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中LinkedHashSet、LinkedHashMap源碼詳解

 更新時(shí)間:2023年09月05日 10:56:44   作者:顏狗備忘錄  
這篇文章主要介紹了Java中LinkedHashSet、LinkedHashMap源碼詳解,LinkedHashMap是一個(gè)以雙向鏈表的方式將Entry節(jié)點(diǎn)鏈接起來的HashMap子類,它在HashMap的基礎(chǔ)上實(shí)現(xiàn)了更多的功能,具有順序存儲(chǔ)和遍歷的特性,需要的朋友可以參考下

1.LinkedHashSet、LinkedHashMap總結(jié)

  • LinkedHashSet底層實(shí)現(xiàn)為L(zhǎng)inkedHashMap
  • 數(shù)據(jù)結(jié)構(gòu)為數(shù)組+雙鏈表/紅黑樹(當(dāng)數(shù)組長(zhǎng)度不小于64,鏈表長(zhǎng)度不小于8,該鏈表轉(zhuǎn)成樹結(jié)構(gòu))
  • 線程不安全
  • 根據(jù)插入順序進(jìn)行排序

備注:

紅黑樹(特殊的平衡二叉樹)5大特性:

  1. 每個(gè)節(jié)點(diǎn)或者是黑色,或者是紅色。
  2. 根節(jié)點(diǎn)是黑色。
  3. 每個(gè)葉子節(jié)點(diǎn)(NIL)是黑色。 [注意:這里葉子節(jié)點(diǎn),是指為空(NIL或NULL)的葉子節(jié)點(diǎn)!]
  4. 如果一個(gè)節(jié)點(diǎn)是紅色的,則它的子節(jié)點(diǎn)必須是黑色的。
  5. 從一個(gè)節(jié)點(diǎn)到該節(jié)點(diǎn)的子孫節(jié)點(diǎn)的所有路徑上包含相同數(shù)目的黑節(jié)點(diǎn)。

2.分點(diǎn)詳解

2.1 LinkedHashSet

2.1.1 繼承實(shí)現(xiàn)情況

在這里插入圖片描述

2.1.2 構(gòu)造方法

//1.無參構(gòu)造方法
public LinkedHashSet() {
		/**調(diào)用父類HashSet的構(gòu)造方法,dummy只是為了重載加的參數(shù),沒有具體含義
		HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        	map = new LinkedHashMap<>(initialCapacity, loadFactor);
    	}
		**/
		//默認(rèn)初始數(shù)組長(zhǎng)度16,加載因子為0.75
        super(16, .75f, true);
    }
//2.有參構(gòu)造方法,數(shù)組長(zhǎng)度
public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }
//3.有參構(gòu)造方法,數(shù)組長(zhǎng)度及加載因子
public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

2.1.3 添加數(shù)據(jù)

使用父類HashSet的添加方法。

2.2 LinkedHashMap

2.2.1 繼承實(shí)現(xiàn)情況

在這里插入圖片描述

2.2.2 構(gòu)造方法

調(diào)用父類HashMap的構(gòu)造方法。

//此參數(shù)是元素排序,等于true的時(shí)候是按哈希值排序,等于false的時(shí)候是按插入順序排序
final boolean accessOrder;
//1.無參構(gòu)造方法
public LinkedHashMap() {
        super();
        accessOrder = false;
    }
//2.有參構(gòu)造方法,數(shù)組長(zhǎng)度
public LinkedHashMap(int initialCapacity) {
        super(initialCapacity);
        accessOrder = false;
    }
//3.有參構(gòu)造方法,數(shù)組長(zhǎng)度和加載因子
public LinkedHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        accessOrder = false;
    }

2.2.3 擴(kuò)容機(jī)制

新增元素使用父類HashMap的put方法,(關(guān)鍵點(diǎn)來了)LinkedHashMap重寫了NewNode方法,使節(jié)點(diǎn)是一個(gè)雙向鏈表節(jié)點(diǎn)。 HashMap的NewNode方法:

Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) {
        return new Node<>(hash, key, value, next);
    }
//HashMap的內(nèi)部類Node
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
        Node(int hash, K key, V value, Node<K,V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
        public final K getKey()        { return key; }
        public final V getValue()      { return value; }
        public final String toString() { return key + "=" + value; }
        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }
        public final V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }
        public final boolean equals(Object o) {
            if (o == this)
                return true;
            if (o instanceof Map.Entry) {
                Map.Entry<?,?> e = (Map.Entry<?,?>)o;
                if (Objects.equals(key, e.getKey()) &&
                    Objects.equals(value, e.getValue()))
                    return true;
            }
            return false;
        }
    }

LinkedHashMap的newNode方法:

Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
        LinkedHashMap.Entry<K,V> p =
            new LinkedHashMap.Entry<K,V>(hash, key, value, e);
        linkNodeLast(p);
        return p;
    }
//LinkedHashMap的內(nèi)部類Entry<K,V> 
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);
        }
    }
//指針前后指向
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
        LinkedHashMap.Entry<K,V> last = tail;
        tail = p;
        if (last == null)
            head = p;
        else {
            p.before = last;
            last.after = p;
        }
    }

到此這篇關(guān)于Java中LinkedHashSet、LinkedHashMap源碼詳解的文章就介紹到這了,更多相關(guān)LinkedHashSet、LinkedHashMap源碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot常見外部配置文件方式詳析

    Spring Boot常見外部配置文件方式詳析

    這篇文章主要給大家介紹了關(guān)于Spring Boot常見外部配置文件方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 淺析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法

    淺析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法

    下面小編就為大家?guī)硪黄獪\析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • SpringEvents與異步事件驅(qū)動(dòng)案例詳解

    SpringEvents與異步事件驅(qū)動(dòng)案例詳解

    本文深入探討了SpringBoot中的事件驅(qū)動(dòng)架構(gòu),特別是通過Spring事件機(jī)制實(shí)現(xiàn)組件解耦和系統(tǒng)擴(kuò)展性增強(qiáng),介紹了事件的發(fā)布者、事件本身、事件監(jiān)聽器和事件處理器的概念,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡(jiǎn)單的增刪改查功能案例詳解

    JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡(jiǎn)單的增刪改查功能案例詳解

    這篇文章主要介紹了JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡(jiǎn)單的增刪改查功能,結(jié)合具體案例形式詳細(xì)分析了JavaWeb JDBC + MySql數(shù)據(jù)庫連接、增刪改查等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • Java獲取接口所有實(shí)現(xiàn)類的方式詳解

    Java獲取接口所有實(shí)現(xiàn)類的方式詳解

    這篇文章主要介紹了Java獲取接口所有實(shí)現(xiàn)類的方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解Java對(duì)象序列化為什么要使用SerialversionUID

    詳解Java對(duì)象序列化為什么要使用SerialversionUID

    這篇文章主要介紹了詳解Java對(duì)象序列化為什么要使用SerialversionUID,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java超詳細(xì)精講數(shù)據(jù)結(jié)構(gòu)之bfs與雙端隊(duì)列

    Java超詳細(xì)精講數(shù)據(jù)結(jié)構(gòu)之bfs與雙端隊(duì)列

    廣搜BFS的基本思想是: 首先訪問初始點(diǎn)v并將其標(biāo)志為已經(jīng)訪問。接著通過鄰接關(guān)系將鄰接點(diǎn)入隊(duì)。然后每訪問過一個(gè)頂點(diǎn)則出隊(duì)。按照順序,訪問每一個(gè)頂點(diǎn)的所有未被訪問過的頂點(diǎn)直到所有的頂點(diǎn)均被訪問過。廣度優(yōu)先遍歷類似與層次遍歷
    2022-07-07
  • Springboot實(shí)現(xiàn)XSS漏洞過濾的示例代碼

    Springboot實(shí)現(xiàn)XSS漏洞過濾的示例代碼

    這篇文章主要介紹了Springboot實(shí)現(xiàn)XSS漏洞過濾的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Springboot結(jié)合Junit單元測(cè)試的實(shí)現(xiàn)

    Springboot結(jié)合Junit單元測(cè)試的實(shí)現(xiàn)

    Spring Boot框架通過整合JUnit,為開發(fā)者提供了便捷的單元測(cè)試支持,本文就來介紹Springboot結(jié)合Junit單元測(cè)試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Java通過文件路徑分隔符分割文件路徑方式詳解

    Java通過文件路徑分隔符分割文件路徑方式詳解

    文章介紹了在處理Windows和Linux文件路徑分隔符時(shí)的差異,強(qiáng)調(diào)直接用File.separator分割路徑會(huì)因正則轉(zhuǎn)義問題導(dǎo)致異常,建議用正則表達(dá)式“/|\\\”兼容兩種系統(tǒng)進(jìn)行路徑分割
    2025-10-10

最新評(píng)論

师宗县| 文登市| 古田县| 淳化县| 安义县| 仲巴县| 青河县| 临沭县| 博兴县| 敦煌市| 哈巴河县| 铜陵市| 璧山县| 清原| 宁强县| 同德县| 通海县| 珠海市| 京山县| 嵩明县| 鸡泽县| 武定县| 洛阳市| 武平县| 板桥市| 长顺县| 海门市| 铅山县| 江城| 黑水县| 亳州市| 乳源| 深圳市| 昔阳县| 吴川市| 霸州市| 吉安市| 康马县| 敖汉旗| 陆川县| 武宁县|