1) hashmap可以接受
null
鍵值和值,而
hashtable
則不能,
hashmap
是非synchronized
的;儲存的是鍵值對。
2) hashmap是基於
hashing原理,
使用put(key,value)
儲存物件到
hashmap
中,使用
get(key)
從hashmap
中獲取物件,當我們給
put方法傳遞鍵和值時,我們先對鍵呼叫
hashcode()
方法,返回的
hashcode
用於找到
bucket
位置來儲存鍵物件和值物件,作為
3) 如果兩個物件hashcode
相同:儲存時:他們會找到相同的bucket
位置,發生碰撞,因為
hashmap
使用鍊錶儲存物件(每個
map.entry
都有乙個
next
指標),這個
entry
會儲存在鍊錶中。
獲取時:
會用hashcode
找到bucket
位置,然後呼叫
key.equals()
方法找到鍊錶中正確的節點
.最終找到要找的值物件
.減少碰撞:使用final
修飾的物件、或不可變的物件作為鍵,使用
(integer
、string)
(是不可變、
final的,
而且已經重寫了
equals
和hashcode
方法)這樣的
類作為鍵是非常好的,(我們可以使用自定義的物件作為鍵嗎?答:當然可以,只要它遵守了equals
和hashcode
方法定義規則,並且當物件插入到
map中之後將不會再改變。)
4) hashmap負載因子預設是
0.75
,可設定,當
map填滿了
75%的
bucket
時候,將會建立原來
hashmap
大小兩倍的
bucket
陣列,來重新調整
map的大小,並將原來的物件放入新的
bucket
陣列中,
這個過程叫做
rehashing
,因為它呼叫
hash
方法找到新的
bucket
位置。5) 重新調整map
大小可能會發生競爭問題:如果兩個執行緒都發現
hashmap
需要調整大小了,它們都會嘗試進行調整,在調整中,儲存在鍊錶中的元素的次序會反過來,因為移動
bucket
位置的時候,
hashmap
並不會將元素放在鍊錶的尾部,而是放在頭部,這是為了避免尾部遍歷,如果條件競爭發生了,就死迴圈了。
HashMap的實現原理
一。hashmap的資料結構 資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列 陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小...
HashMap實現原理
hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...
HashMap實現原理
資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是...