HashMap允许重复吗?

19

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

如果我这样写,

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

它会抛出一个错误或异常吗?还是会覆盖返回值?或者返回什么值?


59
你为什么不试试? - Suresh Atta
4
查看集合API。 null 作为键总是一个糟糕的选择,所以请仔细考虑您要做什么。如果存在两个相等的键,则第一个键的值将被当前键的值替换。 - Diversity
请查看以下链接:https://dev59.com/HHI-5IYBdhLWcg3wy70d。 - Diversity
6个回答

36

如果哈希映射的键相同时,使用覆盖方式重新赋值。

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

输出

key:value
1:2222

13

HashMap 中,每个 键(key) 必须是唯一的。

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

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

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

关于 null 值:允许一个 null 键(key)(因为键必须是唯一的),但 HashMap 可以有任意数量的 null 值(values),而且一个 null 键不需要有一个 null 值。根据文档

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

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


12

在这个意义上,它不允许重复,但它允许添加您,但不关心此键是否已经具有值。因此,目前对于一个键,只会有一个值

它会默默地覆盖null键的value。没有异常。

当您尝试使用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

9
代码示例:

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

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

System.out.println(h);

输出:

{null=a}

它将覆盖键为 null 的值


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

0
m.put(null,null); // here key=null, value=null
m.put(null,a);    // here also key=null, and value=a

哈希映射中不允许有重复的键。
但是,值可以重复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接