天天看點

JAVA - HashMap和HashTable 

1. HashMap

1)  hashmap的資料結構 

  Hashmap本質就是一個數組,隻是當key值重複時,使用連結清單的方式來存儲重複的key值(拉鍊法),注意:連結清單中存放的仍然是key值。如下圖示:

JAVA - HashMap和HashTable 

        當我們往hashmap中put元素的時候,先根據key的hash值得到這個元素在數組中的位置(即下标),然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同一個位子上的元素将以連結清單的形式存放,新加入的放在鍊頭,最先加入的放在鍊尾。

2)使用

2. HashTable和HashMap差別

第一,繼承不同。

第二

Hashtable 中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。在多線程并發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。

第三

Hashtable中,key和value都不允許出現null值。

在HashMap中,null可以作為鍵,這樣的鍵隻有一個;可以有一個或多個鍵所對應的值為null。當get()方法傳回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。是以,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

第四,兩個周遊方式的内部實作上不同。

Hashtable、HashMap都使用了 Iterator。而由于曆史原因,Hashtable還使用了Enumeration的方式 。

第五

哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

第六

Hashtable和HashMap它們兩個内部實作方式的數組的初始大小和擴容的方式。HashTable中hash數組預設大小是11,增加的方式是 old*2+1。HashMap中hash數組的預設大小是16,而且一定是2的指數。