淺談java面試題hashmap,hashtable,treemap,linkedhashmap的區別
淺談java面試題hashmap,hashtable,treemap,linkedhashmap的區別
#先談談hashmap的實現原理(其他的都是在hashmap的基礎上實現的,他們都是屬於map介面下的實現類)
hashmap的實現是基於陣列+連結串列+紅黑樹實現的
hashmap是通過鍵和值得方式來儲存資料的,至於他的實現原理如下:
首先,hashmap中基於陣列實現,陣列的長度預設為16,載入因子預設為0.75(即當陣列記憶體空間達到百分之75時代表空間已經滿了,就需要擴容,而擴容的演算法是陣列原先大小*2),通過計算key鍵的hash值,將其hash值和陣列的初始大小16取%然後得到的值就是key儲存在陣列中的位置。(比如key的值為int型別int a=1,因為int型別的hashcode()值為他本身,所以a在陣列中的位置是1%16等於1,在陣列中存在1索引),然後當多個key的位置都在一個地方時,即這個位置有多個物件,那麼就用連結串列儲存,在jdk1.8之後當連結串列長度大於8時就用紅黑樹實現。
HashMap類中關鍵方法
final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
int s = m.size();
if (s > 0) {
if (table == null) { // pre-size
float ft = ((float)s / loadFactor) + 1.0F;
int t = ((ft < (float)MAXIMUM_CAPACITY) ?
(int)ft : MAXIMUM_CAPACITY);
if (t > threshold)
threshold = tableSizeFor(t);
}
else if (s > threshold)
resize();
for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, evict);
}
}
}
掌握hashmap原理後,下面談談這幾個的區別
hashmap
key值允許為空,並且只能有一個key值為空,value值可以有多個為空,
hashmap中存的資料是無序的,遍歷是隨機的
hashmap執行緒不安全,不適合多執行緒程式
遍歷速度快
hashtable
不允許key和value的值為空
執行緒是安全的,適合多執行緒程式
相較於hashmap,hashtable的陣列擴充演算法為*2+1,原陣列大小為11
TreeMap
適用於排序時 ,可以按照一定的順序來存值,可以把儲存的記錄根據鍵來排序 基於二叉樹的紅黑樹來實現
LinkedHashMap
儲存了記錄的插入順序, 存的資料是有序的,遍歷時顯示資料的順序即儲存時的順序
速度比hashmap慢
當需要輸出和輸入相同時用 LinkedHashMap