簡體   English   中英

為什么Hashmap允許空鍵?

[英]Why does Hashmap allow a null key?

實際上我讀了很多關於這個問題的帖子,但沒有得到“ 為什么Hashmap允許空鍵? ”的確切原因/答案。 請問一個人能給我一個例子的確切答案嗎?

您對問題的一種解釋:

為什么hashmap允許[只]一個空鍵?

問問自己:如果HashMap允許多個null鍵,地圖對象如何區分它們?

提示:只有一個null值。


您問題的替代解釋

為什么hashmap允許[a] null鍵?

因為它在某些情況下很有用,並且因為沒有真正的語義需要不允許它1,2

相比之下,使用TreeMap不允許使用null鍵,因為考慮到涉及null的排序的含義,支持它們會很困難。

  • 鑒於Comparable的指定語義是拋出NPE。
  • 允許 Comparator器訂購null ,但不是必需的。 許多常見的實現都沒有。

因此,如果TreeMap允許null ,則地圖的行為可能會有所不同,具體取決於是使用Comparator還是Comparable 凌亂。


1 - 至少,這是他們在1998年在Java 1.2中指定HashMap時的觀點。從那時起,一些設計師可能已經改變了主意,但由於行為明確指定 ,因此在不破壞兼容性的情況下無法更改。 它不會發生......

2 - 對null鍵的支持需要HashMap一些特殊情況代碼,這至少增加了實現的復雜性。 目前尚不清楚它是否是HashMap的性能開銷,因為即使不允許使用null鍵,仍然需要對null鍵進行隱式測試。 這很可能是噪音。

Java工程師必須意識到擁有null鍵和值有其用途,比如將它們用於默認情況。 因此,他們在Java 5中為HashMap類提供了具有存儲空鍵和值的能力的集合框架。

在HashMap中插入鍵值對的put方法檢查null鍵並將其存儲在內部表數組的第一個位置。 它不怕空值,也不像Hashtable那樣拋出NullPointerException。

現在,只能有一個空鍵,因為鍵必須是唯一的,盡管我們可以有多個與不同鍵相關聯的空值。

這個鏈接可以回答更多hashmap null key的解釋

HashMap.put的javadoc明確指出:

將指定的值與此映射中的指定鍵相關聯。 如果映射先前包含鍵的映射,則替換舊值。

它清楚地說明當您使用已經在地圖中的鍵進行放置時會發生什么。 key == null的特定情況以相同的方式運行:對於null鍵,您不能有兩個不同的映射(就像您不能為任何其他鍵一樣)。

這仍然被視為在HashMap早期實現中所犯的錯誤 ,不幸的是人們在哪里(依賴?)依賴(以及某些特定的順序,直到java-8)。 問題是,擁有這個null鍵,你總是可以“免費”傳遞一些元數據和你的實際數據。 請注意,所有新集合ConcurrentHashMapMap.of (在java-9中)等都禁止以空值開頭。

暫無
暫無

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

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