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

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

如果我这样写,

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

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

【问题讨论】:

  • 你为什么不试试?
  • 结账集合 API。 Null 始终是键的错误选择。所以看看你想做什么。在两个相等键的情况下,第一个 on 的值将被当前替换。

标签: java hashmap


【解决方案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 中不允许有重复的键。
            但是,值可以重复。

            【讨论】:

              猜你喜欢
              • 2020-05-29
              • 1970-01-01
              • 1970-01-01
              • 2013-04-06
              • 2014-12-12
              • 1970-01-01
              • 1970-01-01
              • 2023-03-16
              • 1970-01-01
              相关资源
              最近更新 更多