2013-12-12 130 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)); 
      } 
     }