【问题标题】:how to add map entries to a synchronized/non synchronized map from a synchronized map java如何从同步映射java将映射条目添加到同步/非同步映射
【发布时间】:2012-03-23 22:34:55
【问题描述】:

如何使用 addAll() - Java 将映射条目从同步映射添加到同步/非同步映射?

 Map<String,String> h = Collections.synchronizedMap(new HashMap<String,String>());
 Map<String,String> g = Collections.synchronizedMap(new HashMap<String,String>());
// or even better - Map<String,String> = new HashMap<String,String>();
 h.put("kkk","eee");
 Set<Map.Entry<String,String>> s = h.entrySet();
 Set<Map.Entry<String,String>> ss = g.entrySet();
 ss.addAll(s); //causes unsupportedoperationexception for both the synchronized version
                // of map g and the unsynchronized, even if this operation is placed 
                  // in a synchronized block (synchronized(h){}, and synchronized(g){})

【问题讨论】:

    标签: java collections map


    【解决方案1】:

    HashMapEntrySet不支持addAll,句号。同步与它无关。要将所有内容从 h 复制到 g,只需执行 g.putAll(h);

    Map.Entry&lt;K,V&gt; 指定equals() 的方式意味着addaddAll 操作对于entrySet 的行为不正确。 Map.Entry 表示如果两个条目的键和值都匹配,则它们是相等的。因此,您应该能够将 ["Foo", "Baz"] 添加到已经包含 ["Foo","Bar"] 的 entrySet 中,因为根据equals,它们并不相同。当然我们知道这是不可能的,entrySet 不能同时包含这两个,Foo 的新映射必须替换旧映射。所以根本不支持这些方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多