map、hashmap

JAVA的容器---List,Map,Set 
Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMap 

Collection是最基本的集合接口,一個Collection代表一組Object,Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List Set,區別在於List是有序的Collection,且其中允許重複的元素,比如我們常用的Vector,ArrayList,LinkedList,都是實現了List接口的類;而Set是一種不包含重複的元素的Collection。 
Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個 value。HashMap是實現了Map接口的具體類。 

1.map與hashmap的區別:

map是接口,不能用new出對象 。
hashmap是繼承map接口的實現類,可以new出對象。HashMap的特點是查找速度快,缺點是不能保證迭代的順序。

LinkedHashMap 能保證迭代的順序。

 

 

2.Hashtable和HashMap的區別:

1.Hashtable是Dictionary的子類,HashMap是Map接口的一個實現類;

2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。即是說,在多線程應用程序中,不用專門的操作就安全地可以使用Hashtable了;而對於HashMap,則需要額外的同步機制。但HashMap的同步問題可通過Collections的一個靜態方法得到解決:

Map Collections.synchronizedMap(Map m)

這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多線程的環境中也是安全的。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。

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

HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許

4.HashTable使用Enumeration,HashMap使用Iterator。 以上只是表面的不同,它們的實現也有很大的不同。 
       5.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因爲contains方法容易讓人引起誤解。

6.HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。

7.哈希值的使用不同,HashTable直接使用對象的hashCode,代碼是這樣的:

int hash = key.hashCode();

int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新計算hash值,而且用與代替求模:

int hash = hash(k);

int i = indexFor(hash, table.length);

static int hash(Object x) {

   int h = x.hashCode();

   h += ~(h << 9);

   h ^= (h >>> 14);

   h += (h << 4);

   h ^= (h >>> 10);

   return h; 

}

 

static int indexFor(int h, int length) {

   return h & (length-1);

}

 

Hashtable和HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異

發佈了20 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章