Java的HashMap和HashTable

1. HashMap數組

1)  hashmap的數據結構 數據結構

     Hashmap是一個數組和鏈表的結合體(在數據結構稱「鏈表散列「),以下圖示:多線程

        當咱們往hashmap中put元素的時候,先根據key的hash值獲得這個元素在數組中的位置(即下標),而後就能夠把這個元素放到對應的位置中了。若是這個元素所在的位子上已經存放有其餘元素了,那麼在同一個位子上的元素將以鏈表的形式存放,新加入的放在鏈頭,最早加入的放在鏈尾。併發

2)使用線程

複製代碼
Map map = new HashMap();
map.put("Rajib Sarma","100");
map.put("Rajib Sarma","200");//The value "100" is replaced by "200".
map.put("Sazid Ahmed","200");

Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
複製代碼

2. HashTable和HashMap區別對象

第一,繼承不一樣。繼承

public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map

第二get

Hashtable 中的方法是同步的,而HashMap中的方法在缺省狀況下是非同步的。在多線程併發的環境下,能夠直接使用Hashtable,可是要使用HashMap的話就要本身增長同步處理了。同步

第三hash

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的指數。 
相關文章
相關標籤/搜索