HashMap 允许重复吗?

Posted

技术标签:

【中文标题】HashMap 允许重复吗?【英文标题】:HashMap allows duplicates? 【发布时间】:2013-12-30 12:48:08 【问题描述】:

我对 HashMap 有疑问,我们都知道 HashMap 允许一个空键和值对,我的问题是

如果我这样写,

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

它会抛出(错误或异常)还是会覆盖该值或返回的值是什么??

【问题讨论】:

你为什么不试试? 结账集合 API。 Null 始终是键的错误选择。所以看看你想做什么。在两个相等键的情况下,第一个 on 的值将被当前替换。 检查:***.com/questions/1669885/… 【参考方案1】:

Hashmap 类型 如果 hashmap 键是相同的键,则覆盖该键

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

输出

key:value
1:2222

【讨论】:

【参考方案2】:

HashMap 中的每个 key 必须是唯一的。

当“添加重复键”时,旧值(对于同一个键,因为键必须是唯一的)被简单地替换;见HashMap.put:

将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,旧值将被替换

返回与 key 关联的先前值,如果没有 key 映射,则返回 null。

就空值而言:允许单个空 key(因为键必须是唯一的)但 HashMap 可以有任意数量的空 ,以及一个空键不必有空值。根据documentation:

[..HashMap] 允许 null values 和 [a] null key.

但是,文档没有说明 null/null 需要是特定的键/值对或 null/"a" 无效。

【讨论】:

【参考方案3】:

在某种意义上不允许重复,它允许添加你,但它不关心这个键是否已经有一个值。所以目前one key只会有one value

它以静默方式覆盖 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

【讨论】:

【参考方案4】:

代码示例:

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.

【讨论】:

【参考方案5】:

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));
            
        

【讨论】:

【参考方案6】:
m.put(null,null); // here key=null, value=null
m.put(null,a);    // here also key=null, and value=a

hashmap 中不允许有重复的键。 但是,值可以重复。

【讨论】:

以上是关于HashMap 允许重复吗?的主要内容,如果未能解决你的问题,请参考以下文章

HashMap详解

LinkedHashMap和HashMap的比较使用

HashMap,LinkedHashMap,TreeMap的区别(转)

HashMap,LinkedHashMap,TreeMap的区别(转)

HashMap,LinkedHashMap,TreeMap的区别

初识HashMap