2013-04-22 152 views
0

今天我正在修復一個缺陷,發現了一件非常有趣的事情。`putForNullKey`方法在hashmap的`put`方法中做了什麼?

我試圖把一個關鍵值對放在hashmap中。 (我假設鑰匙在那裏,但後來發現它是空的)。

所以,當使用一個鍵檢索值時,我並沒有每次都收到空值。

後來我發現密鑰爲空,我糾正了它。

但後來我看到put方法的代碼Hashmap

爲什麼在keynull時沒有例外?

它調用putForNullKey私有方法。它有什麼作用?

但我想這應該會給一些例外,如果密鑰爲空。

爲什麼他們沒有像那樣實現它? 如果密鑰爲空,則密鑰值對沒有用處?

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.putForNullKey%28java.lang.Object%29

回答

3

從Javadoc文檔的HashMap:

Hash table based implementation of the Map interface. 
This implementation provides all of the optional map 
operations, and permits null values and the null key 

這是由設計,並進行了說明。 '爲什麼'這個問題很難回答,但是自從HashMal(以及之前的Hashtable)被引入(編輯,實際上,Hashtable不允許爲空)以來就一直如此。

至於爲什麼它具有putNullKey,那麼HashMap依賴於一個鍵的hashCode()來放置它,並且,因爲它無法從null值獲取hashCode(),所以必須這樣做作爲特例。

1

這是HashtableHashMap之間的區別之一。

Hashtable不允許空鍵或值。 HashMap允許一個空鍵和任意數量的空值。

通常我們使用空鍵表示默認情況下(即,如果一個給定的密鑰不存在應該被使用的值)

0

HashMap中只允許有一個空鍵。因此,無論何時,如果任何人想用null放置一些值,它會在put方法內部調用putForNullKey方法,並在putForNullKey方法中將該值放在零索引處。

對於通過null鍵獲取值,它也有一個方法getForNullKey,它從get方法內部調用。