HashTable 是線程安全的,用了synchronized限制了每個方法,并且Key和Value都不能是Null.其它和HashMap沒什麼差别。
Hashmap用對象的hashCode()對數組長度進行取模來決定放在哪個bucket中,并且1.8中當一個bucket中的連結清單過長是,該會轉換成紅黑樹,變短時也會退化回連結清單。另一個差別是HashMap的疊代器(Iterator)是fail-fast疊代器,而Hashtable的enumerator疊代器不是fail-fast的。是以當有其它線程改變了HashMap的結構(增加或者移除元素),将會抛出ConcurrentModificationException,但疊代器本身的remove()方法移除元素則不會ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的差別。
ConcurrentHashMap把鎖的粒度細化了 ,隻鎖住某個bucket,而不鎖住整個方法。
LinkedHashMap 中,對于Entry<K,V>維護了一個雙向連結清單,并且可以設定按accessOrder維護連結清單,對于實作LRU的算法很友善。其它的跟HashMap差不多,是HashMap的子類。
TreeMap是紅黑樹實作的,在設計排序的時候可以使用