天天看點

set集合基礎

應該先學習一下 map 在學習set

set 接口繼承了 collection 接口

主要有兩個個實作類 hashset    treeset

set 集合的存儲是無序的 ,不可重複的。

hashset 底層存儲用的是 hashmap,那 hashmap 底層又是什麼?

資料結構——HashMap底層實作_Alisazxy的部落格-CSDN部落格_hashmap底層資料結構 我也是看這個部落格的,源碼看不懂。。。

jdk 8 以前 hashmap 是數組加連結清單,預設數組初始長度是16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;      

為什麼預設初始長度要這樣寫,而不是直接寫16呢?

查了一下是因為位運算比普通加減乘除快

jdk8 以後 hashmap 底層是數組加連結清單加紅黑樹

數組上的一個位置就能變成一個連結清單,連結清單太長(長度大于8),就把連結清單變成紅黑樹。

再說說hashset的無序性,無序性不是随機性,這個無序性是指将資料存儲入底層數組(這個數組來自 hashset -> hashmap -> 數組+連結清單,hashset 最底層是數組)并不是按照先後順序放入數組,而是通過hash函數(我也不知道這個是什麼東西,有空再查查),計算出資料的hash值,再通過算法(簡單認為将 hash 值除 數組長度)計算出這個資料再數組中的位置。

描述的不清楚

java中hashmap的實作原理與底層資料結構_技術小白的部落格-CSDN部落格   看看這個

如果多個資料都在數組的同一位置上,會先比較資料是否重複,首先比較兩個資料的hash值是否相同,在同一數組位置上的資料的hash值可能是不同的,例如  hash值為 1/16(取模) 放在數組第一個位置, 17/16 也是放在數組第一個位置,如果hash值相同就用equals 比較(對象還要重寫hashcode方法),如果存儲的是基本資料類型沒有equals方法用什麼比較?

不能放入基本資料類型,sb

當已經使用的數組+連結清單長度達到數組總長度的0.75,數組就會自動擴容,數組總長度擴大為原來的2倍。

再說說hashmap,為什麼hashset是單列的,會變成雙列的map,什麼東西在hashmap裡面作為key?什麼又做value?

百度了一下。。。。烏煙瘴氣

大概是key存放的是引用類型對象的位址

value沒查出來,大意就是value是一個object類型的對象(這句話抽象的一比,有人懂的話幫幫孩子,求求了。。)

HashSet/HashMap 存取值的過程 - 無名草110 - 部落格園 (cnblogs.com)  這個不錯,底層代碼好像改了

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

 把entry 靜态方法改成了node  隻是名字變了,其他應該沒變。。。應該吧。。。

歐   我歇逼了   知識有多又雜

簡而言之

hashset 線程不安全  可以存儲null

linkset 和hashset 差不多,加了個連結清單,可以通過連結清單記錄順序,假裝是有序的