HashMap 和 Hashtable 的同和不同

2022-03-21 01:57:50 字數 2061 閱讀 3715

可以直接根據 hashcode 值判斷兩個物件是否相等嗎?肯定是不可以的,因為不同的物件可能會生成相同的 hashcode 值。雖然不能根據 hashcode 值判斷兩個物件是否相等,但是可以直接根據 hashcode 值判斷兩個物件不等,如果兩個物件的 hashcode 值不等,則必定是兩個不同的物件。如果要判斷兩個物件是否真正相等,必須通過 equals 方法。

也就是說對於兩個物件,如果呼叫 equals 方法得到的結果為 true,則兩個物件的 hashcode 值必定相等;如果 equals 方法得到的結果為 false,則兩個物件的 hashcode 值不一定不同;如果兩個物件的 hashcode 值不等,則 equals 方法得到的結果必定為 false;如果兩個物件的 hashcode 值相等,則 equals 方法得到的結果未知。

hashmap 和 hashtable 不保證 map 的順序,也不保證順序不會隨著時間不變。

hashmap 例項有兩個引數影響效能:初始 capacity 和 load factor。capacity 是 hashtable 中桶的數量,初始 capacity 就是 hashtable 建立時的 capacity。load factor 影響 hashtable 多滿時允許自動增加 capacity。當 hashtable 中 entry 的數量超過 load factor 和當前 capacity 的乘積,hashtable 會重新雜湊(意味著,內部資料結構重建)因此 hashtable 大約擁有桶數量的兩倍。

作為通用規則,預設 load factor(0.75)在時間和空間消耗上提供了好的權衡。值越大,空間開銷越小,但是遍歷成本增加(表現在大多數操作,包括 get 和 put)。當設定初始 capacity 時,為了最小化重新 hash 的操作次數,應該考慮 map的 entry 數量和 load factor。如果初始容量大於最大 entry 數量除以 load factor ,重新 hash 操作將不會發生。然而,設定初始 capacity 太大會浪費空間。

成員變數

值default_load_factor

0.75

treeify_threshold

8untreeify_threshold

6min_treeify_capacity否則resize()

64size

threhold

capacity*load factor

hashmap

hashtable

執行緒安全

不安全安全

允許null的鍵和值

允許不允許

實現和繼承

實現map

實現map,繼承dictionary

遍歷方式

iterator

iterator和enumeration

計算雜湊值

(key == null) ? 0 : (h = key.hashcode()) ^ (h >>> 16)

(key.hashcode() & 0x7fffffff)

計算陣列下標

(length - 1) & hash

hash % length

default_initial_capacity

1611

容量增加方式

old*2長度始終為2的冪

old*2+1

建構函式

threshold=tablesizefor(initialcapacity)

threhold=initialcapacity*load factor

resize

從0-cap鍊錶順序不變

從cap-0鍊錶順序相反

注意點:

計算陣列下標:當length總是2的n次方時,h & (length - 1)運算等價於對 length 取模,也就是 h % length,但是&比%具有更高的效率。

容量增加方式:當陣列長度為 2 的 n 次冪的時候,不同的 key 算得的 index 相同的機率較小,那麼資料在陣列上分布就比較均勻,也就是說碰撞的機率小。相對的,查詢的時候就不用遍歷某個位置上的鍊錶,這樣查詢效率也就較高了。導致 resize() 不同 hashmap 直接使用之前的陣列下表,而 hashtable 需要重新計算。

HashMap的工作原理和hashtable區別

1.hashmap的工作原理?hashmap底層是陣列 鍊錶 以陣列儲存元素,如有hash相同的元素,在陣列結構中,建立鍊錶結構,再把hash相同的元素放到鍊錶的下乙個節點 基於hashing 雜湊法 雜湊法 是一種將字元組成的字串轉換為固定長度的數值或索引值的方法 的原理。通過put get 方法...

HashMap和LinkedHashMap的區別

hashmap,linkedhashmap,treemap都屬於map map 主要用於儲存鍵 key 值 value 對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複。hashmap 是乙個最常用的map,它根據鍵的hashcode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。ha...

HashMap和LinkedHashMap的區別

hashmap,linkedhashmap,treemap都屬於map map 主要用於儲存鍵 key 值 value 對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複。hashmap 是乙個最常用的map,它根據鍵的hashcode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。ha...