可以直接根據 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...