HashMap 是基於 hashing 來取得儲存的位置,接著我們可以透過 put 去放置要儲存的 key value pair,或用 get 去取回值。
如果有兩個 key hashing 是同樣的位置,此時會使用 LinkedList 串起來。而存放在 bucket 裡的不單只有值,我們是以 Map.Entry 形式存在 bucket 裡。因此,如果今天發生 collision,就可以用 equals 比較哪個才是我們要找的 key,取回正確的值
如果 map 超過了 load vector,我們會需要 rehashing。也就是開一個兩倍大的 HashMap,把原本的資料移過去
在調整大小的過程中,有可能會發生 race condition。由於 HashMap 是非同步的,比如有兩個 thread 都想調整 map 大小,如此有可能導致 dead loop。因此,若在此種情況,要選擇使用 thread safe 的資料結構
p.s. 在選擇 map 的 key 時,最好選擇像 String, Integer 這類的 wrapper。像 String 被創建之後,就不可變,是 final,也重寫過 equals 跟 hashCode()。不可變性是需要的,因為要計算 hashCode(),要保證 key 是不會變的