1. 程式人生 > 其它 >Java基礎-LinkedHashSet底層原始碼分析

Java基礎-LinkedHashSet底層原始碼分析

package com.hspedu.linkedhash_;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;


@SuppressWarnings({"all"})
public class Course528 {
    public static void main(String[] args) {
        // LinkedHashSet原始碼


        /*
         *  1、LinkedHashSet是HashSet的子類,底層是LinkedHashMap,其底層是陣列+雙向連結串列(HashMap是單向連結串列)
         *  2、每一個節點都有before和after屬性,形成雙向連結串列
         *  3、LinkedHashSet根據元素的hashCode值決定元素的儲存位置,如果已經存在則不新增
         *  4、因為是雙向連結串列維護元素的次序,所以遍歷元素是按照儲存順序
         *
         *  第一次新增元素時,將陣列table擴容到16大小,存放的節點型別是LinkedHashMap$Entry
         *      陣列(編譯型別)型別是HashMap$Node[]型別,存放的資料型別(執行型別)是LinkedHashMap$Entry[]
         *
         * 
*/ Set set = new LinkedHashSet(); set.add(new String("AA")); set.add(456); set.add(456); set.add(new Customer("劉", 1001)); set.add(123); set.add("hsp"); System.out.println("set = " + set); /* LinkedHashSet底層:LinkedHashMap,擴容機制和HashMap一樣,初始tab大小16,臨界閾值12(因子0.75) // 確定新增節點後,tab設定last節點分析: private void linkNodeLast(LinkedHashMap.Entry<K,V> p) { LinkedHashMap.Entry<K,V> last = tail; // 尾節點賦給last臨時變數 tail = p; // 尾節點tail指向新的p節點 if (last == null) // 如果該連結串列的last為null,新增節點同樣是頭節點 head = p; else { // 如果該連結串列的last不為null p.before = last; // 新增節點的before指向原來連結串列的尾節點 last.after = p; // 連結串列的尾節點指向新增節點p } }
*/ } } @SuppressWarnings({"all"}) class Customer { private String name; private int no; public Customer(String name, int no) { this.name = name; this.no = no; } }