2013-12-12 133 views
10

我有一個關於HashMap中的疑問,大家都知道的HashMap允許一個空鍵值對,這裏我的問題是HashMap允許重複?

如果我寫這樣的,

m.put(null,null); 
m.put(null,a); 

將它扔了(錯誤或例外),還是將它重寫的價值或什麼將returing的價值?

+38

你爲什麼不試試? –

+3

簽出收集API。空對於一個鍵來說總是不好的選擇。所以看看你想做什麼。在兩個相同的鍵的情況下,第一個的值將被當前取代。 – Diversity

+0

檢查:http://stackoverflow.com/questions/1669885/what-happens-when-a-duplicate-key-is-put-into-a-hashmap – Diversity

回答

4

不允許在這個意義上的重複,它允許添加你卻一點兒也不瞭解這個關鍵的護理已經有一個值或沒有。因此,在本作一個關鍵只會有一個

它靜靜地覆蓋valuenull關鍵。沒有例外。

當你試圖獲得與null最後插入值將回歸。

這不僅與null和任意鍵。

有一個簡單的例子

Map m = new HashMap<String, String>(); 
    m.put("1", "a"); 
    m.put("1", "b"); //no exception 
    System.out.println(m.get("1")); //b 
7

每個HashMap必須是唯一的。

當「添加複製的鑰匙」的舊值(對於相同的鍵,作爲鍵必須是唯一的)被簡單地替換;請參閱HashMap.put

將指定的值與此映射中的指定鍵關聯。如果地圖先前包含密鑰的映射,則舊值將被替換爲

返回與密鑰相關聯的先前值,如果沒有密鑰映射,則返回null。

至於空:一個空被允許(如鑰匙必須是唯一的),但HashMap中可以有任意數量的空,並null鍵不需要有一個空值。每documentation

[.. HashMap中]允許空值 [A]空

然而,文件說,沒有約空/空需要爲特定的鍵/值對或空/「一」是無效的。

8

代碼例如:

HashMap<Integer,String> h = new HashMap<Integer,String>(); 

h.put(null,null); 
h.put(null, "a"); 

System.out.println(h); 

輸出:

{null=a} 

It overrides the value at key null

16

的Hashmap類型覆蓋該鍵,如果HashMap的關鍵是相同的密鑰

map.put("1","1111"); 
map.put("1","2222"); 

輸出

key:value 
1:2222 
3

HashMap中不允許重複鍵,但因爲它不是線程安全的,它可能會出現重複鍵。 例如:

while (true) { 
      final HashMap<Object, Object> map = new HashMap<Object, Object>(2); 
      map.put("runTimeType", 1); 
      map.put("title", 2); 
      map.put("params", 3); 
      final AtomicInteger invokeCounter = new AtomicInteger(); 

      for (int i = 0; i < 100; i++) { 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         map.put("formType", invokeCounter.incrementAndGet()); 
        } 
       }).start(); 
      } 
      while (invokeCounter.intValue() != 100) { 
       Thread.sleep(10); 
      } 
      if (map.size() > 4) { 
// this means you insert two or more formType key to the map 
       System.out.println(JSONObject.fromObject(map)); 
      } 
     }