為什麼HashTable不允許null為鍵或者值?

時間 2021-05-29 23:56:59

1樓:王李紅

以下回答摘自stackoverflow:

Hashtable 是較古老的類,通常不鼓勵使用它。 在之後的使用中,設計人員發現開發中通常需要乙個空鍵或者空值,於是就在HashMap中增加了對null的支援。

HashMap最為HashTable之後實現的類,具有更高階的功能,這基本上只是對Hashtable功能的改進。 建立HashMap時,它專門設計為將空值作為鍵處理並將其作為特殊情況處理。

補充:JDK原始碼中作者的注釋:

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

要從Hashtable成功儲存和檢索物件,用作鍵的物件必須實現hashCode方法和equals方法。

由於null不是物件,因此不能在其上呼叫.equals()或.hashCode(),因此Hashtable無法將其計算雜湊值以用作鍵。

2樓:淚花

ConcurrentHashmap和Hashtable都是支援併發的,這樣會有乙個問題,當你通過get(k)獲取對應的value時,如果獲取到的是null時,你無法判斷,它是put(k,v)的時候value為null,還是這個key從來沒有做過對映。HashMap是非併發的,可以通過contains(key)來做這個判斷。而支援併發的Map在呼叫m.

contains(key)和m.get(key),m可能已經不同了。

3樓:

首先,HashTable 是乙個過時的類,不應該再使用了。

其次,從 JDK 文件中,我們可以看到當時作者是怎麼想的。

* This class implements a hash table, which maps keys to values. Any

* non-null object can be used as a key or as a value.

** To successfully store and retrieve objects from a hashtable, the

* objects used as keys must implement the hashCode

* method and the equals method.

可以看出,當時不允許是因為希望每個 key 都會實現 hashCode 和 equals 方法。而 null 顯然沒有。

後來,大家都意識到 null 值的重要性,所以 HashMap 允許 null 值的 key 和 value。當 key 為 null 時,HashMap 將會把 key-value pair 存放在乙個特殊的位置,比如第乙個槽位里。

飛機為什麼不允許踩點登機?

BillKillWall 機票和火車票不同,火車發車時間前兩三分鐘停止檢票也來得及,但登機牌上的時間是航班計畫起飛時間,飛機從結束登機到起飛中間需要經過一系列推出滑行和安全檢查的操作,還需要和其他航班排隊共用跑道起飛,做不到 說走就走 所以等到了起飛時間,此時飛機已經脫離廊橋,在跑道上準備加速起飛了...

科學不允許假設嗎?為什麼?

打火機不好吃 因為這個假設沒啥意義啊。而且科學 尤指物理學 的假設是為了檢驗。用數理統計的方法進行假設檢驗,結果發現你說的那些假設應該被拒絕,那還有什麼假設的必要? 魯新奎 我們需要通過推理思維得到真理,邏輯就是推理的規則,是為保證推理過程正確。但邏輯規則本身不能得到真理,推理需要邏輯前提,如果推理...

戰爭中不允許射擊傘兵還是不允許射擊跳傘中的飛行員?

放空放生放你走 從物理學視點來講 傘降的高度和速度都是由約束的,客機的布局就注定底子不行能有傘降成功的可能性,首要,傘降速度約束是350公里 小時 側門 450公里 小時 尾門 傘降高度不高於4500公尺 以上是空降兵的訓練大綱要求 客機到350公里小時就需求翻開襟翼才能夠,空難的時分襟翼還能正常翻...