簡體   English   中英

為什么Hashtable不帶空鍵?

[英]Why does Hashtable not take null key?

為什么Hashtable不采用null鍵?

為什么HashMap允許null鍵?

使這兩個類的目的是什么?Key行為如此不同?

Hashtable JavaDoc

To successfully store and retrieve objects from a hashtable, the objects used 
as keys must implement the hashCode method and the equals method.

簡而言之,由於null不是對象,因此不能在其上調用.equals().hashCode() ,因此Hashtable無法計算哈希值以將其用作鍵。

HashMap更新,並且具有更高級的功能,這基本上只是對Hashtable功能的改進。 因此,在創建HashMap時,它專門設計為將null值作為鍵處理並將其作為特殊情況處理。

具體來說,在發出.get(key)時,使用null作為鍵是這樣處理的:

(key==null ? k==null : key.equals(k))

這只是一個實現細節。

Hashtable是較舊的類,通常不鼓勵使用它。 也許他們看到需要一個null鍵,更重要的是 - null值,並將其添加到HashMap實現中。

Hashtable早於集合框架,是JDK 1.0的一部分。 那時,空鍵可能被認為是無用的或不是必需的,因此被禁止。 您可能會將其視為設計錯誤,就像選擇名稱Hashtable而不是HashTable

然后,幾年后,收集框架,Hashtable稍作修改,以適應框架。 但是沒有更改null鍵上的行為以保持向后兼容性。

應該棄用Hashtable,恕我直言。

我會讓你知道hashmap如何在內部存儲對象:

HashMap通過put(key,value)存儲值,並獲取值get(key) 該過程遵循Hashing的概念。

當我們說put(key,value) - 計算密鑰的內部hashCode()並將其作為hashfunction()的輸入來查找存儲的存儲區位置。

在碰撞的情況下 - 在計算hashcode() ,可能存在密鑰不同但hashcode()相同的可能性,此時在找到存儲桶位置之后,存儲在鏈表中完成。 請注意 - 存儲為Map.Entry時,存儲鍵值。

當通過key檢索值時,如果在碰撞期間密鑰的hashcode()可能相同,則通過equals()函數重新獲取該值以找出所需的密鑰的值。

問候,阿南德

除了在其他答案中給出的所有細節之外,這是hashmap允許NULL鍵的方式。 如果查看Hashmap(JDK 5)中的方法putForNullKey() ,它會為null鍵保留索引“0”。 null鍵的所有值都保存在數組的“0”索引中。

存儲NULL值沒有什么特別之處,因為所有put和lookup操作都基於Key對象工作。

在散列表中,Java沒有這些機制,因此散列表不支持NULL鍵或值。

它們是兩個不同的類,分為兩個不同的東西。 此外,HashTable是同步的。 HashTable也出現在HashMap之前,所以很自然它會不那么先進。 在早期的Java中生成空哈希碼可能沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM