應該先學習一下 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 差不多,加了個連結清單,可以通過連結清單記錄順序,假裝是有序的