2012-03-21 45 views
1

治療有什麼可以合理下面的輸出? 空元素對列表和地圖的處理方式不同。如何null元素是通過列表和地圖中的Java

List<Object> hoo = new ArrayList<Object>() { 
    { 
     add(null); 
     add(null); 
    } 
}; 

Map<Object, Object> bar = new HashMap<Object, Object>() { 
    { 
     put(null, null); 
     put(null, null); 
     put(null, null); 

    } 
}; 
System.err.println("hoo:" + hoo.size()); 
System.err.println("bar:" + bar.size()); 

輸出:

hoo:2 
bar:1 
+3

什麼你所期望的?您也會看到與任何單個非null對象相同的內容。等價值(顯然)被列表和地圖不同地對待,就是這樣。 – 2012-03-21 06:43:49

回答

9

具體:列出可以有重複的項目,但地圖不能有重複鍵,這就是爲什麼我們可以在列表中有2個空,但只有一個在地圖空。

回答你的更普遍的問題(這些接口的行爲就重複的邏輯),是沒有任何一個「多」或「少」的邏輯來實現在地圖空約束方式。

當然,沒有通用規則:例如 - 最初,java的哈希表沒有允許空值。
但後來,HashMap中實現不同的行爲(允許空值)。由於真實世界當然有我們可以有空值的實例,但是有很少的情況下我們會/應該有一個空的鍵,所以您可能會問自己爲什麼有多個空鍵和空值的條目值在同一個數據結構中 - 這些值實際上是否代表任何有意義的值?

0

HashMap不會允許你存儲的值有重複鍵(在這種情況下,你的價值爲null)。這就是第二種情況下尺寸爲「1」的原因。

2

因爲Map只能有唯一的密鑰。在這種情況下,它的第一個電話後null

put(null, null); 
put(null, null); 
put(null, null); 

上一頁語句實際上覆蓋值。這就是爲什麼大小保持1種

+2

+1。與null無關,的確如此。 'add(「a」)'會發生同樣的事情 – Thilo 2012-03-21 06:45:01

1

Java documentation狀態:

如果映射以前包含了一個該鍵的映射,舊值 被替換

bar:1是完全正確的。

相關問題