HashTable和HashMap的區別

2021-05-25 02:35:58 字數 3646 閱讀 2318

hashtable的應用非常廣泛,hashmap是新框架中用來代替hashtable的類,也就是說建議使用hashmap,不要使用hashtable。可能你覺得hashtable很好用,為什麼不用呢?這裡簡單分析他們的區別。

1.hashtable的方法是同步的,hashmap未經同步,所以在多執行緒場合要手動同步hashmap這個區別就像vector和arraylist一樣。

2.hashtable不允許null值(key和value都不可以),hashmap允許null值(key和value都可以)。

3.hashtable有乙個contains(object value),功能和containsvalue(object value)功能一樣。

4.hashtable使用enumeration,hashmap使用iterator。

以上只是表面的不同,它們的實現也有很大的不同。

5.hashtable中hash陣列預設大小是11,增加的方式是 old*2+1。hashmap中hash陣列的預設大小是16,而且一定是2的指數。

6.雜湊值的使用不同,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)

static int indexfor(int h, int length)

以上只是一些比較突出的區別,當然他們的實現上還是有很多不同的,比如

hashmap對null的操作。

補充:

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

不用多說,看下面的程式就可以:

hashmap map =newhashmap();

map.put(

"null"

,null);

map.put(null,

"null");

map.put(null,

"empty");

system.

out.println(map.get(null));

system.

out.println(map.get(

"null"

));

system.

out.println(map.get(

"nullthere"

));

system.

out.println(map.containskey(

"null"

));

system.

out.println(map.containskey(

"nullthere"

));

輸出結果為:

empty

null

null

true

false

hashmap

hashtable

繼承,實現

hashmap

extendsabstractmapimplementsmap, cloneable, serializable

hashtable

extendsdictionary

implementsmap, cloneable,serializable

多執行緒,同步

未同步的,可以使用colletcions進行同步

map collections.synchronizedmap(map m)

已經同步過的可以安全使用

對null的處理

hashmap map =newhashmap();

map.put(null,

"null"

); map.put(

"null"

,null);

map.containskey(null);

map.containsvalue(null);

以上這5條語句無論在編譯期,還是在執行期都是沒有錯誤的.

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

hashtable table = new hashtable();

table.put(null, "null");

table.put("null", null);

table.contains(null);

table.containskey(null);

table.containsvalue(null);

後面的5句話在編譯的時候不會有異常,可在執行的時候會報空指標異常

具體原因可以檢視源**

public synchronized v put(k key, v value)

………….

增長率voidaddentry(inthash, k key, v value,intbucketindex)

protectedvoidrehash()

} }

雜湊值的使用

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

publicbooleancontainskey(object key)

returnfalse;

}

hashtable直接使用物件的hashcode,**是這樣的:

publicsynchronizedbooleancontainskey(object key)

}returnfalse;

}

Java中HashTable和HashMap的區別

1 hashtable的方法是同步的,hashmap不同步,所以在多執行緒情況下,使用的是hashtable 2 hashtable不允許null值 key和value都不可以 hashmap允許null值 key和value都可以 3 hashtable有乙個contains 方法,功能和cont...

資料結構之HashTable與HashMap

首先介紹一下hashtable 與hashmap hashtable類實現乙個雜湊表,該雜湊表將鍵對映到相應的值。任何非 null 物件都可以用作鍵或值。hashmap是基於雜湊表的map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。hashmap不保證對映的...

Hashtable和Dictionary效能比較

在.net1.1裡經常會使用到hashtable,到裡.net 2.0以後我發現有了乙個很好用的idictionary實現類dictionary。但還是會擔心dictionary的檢索效率是否跟hashtable相當,據我了解arraylist的檢索效率是非常差的,binarysearch也不如ha...