两个或更多(哈希)映射的联合

Jav*_*ero 12 java performance hashmap

我有两个包含相同类型对象的地图:

Map<String, TaskJSO> a = new HashMap<String, TaskJSO>();
Map<String, TaskJSO> b = new HashMap<String, TaskJSO>();

public class TaskJSO { String id; }
Run Code Online (Sandbox Code Playgroud)

地图键是"id"属性.

a.put(taskJSO.getId(), taskJSO);
Run Code Online (Sandbox Code Playgroud)

我想获得一个列表:"Map b"中的所有值+"Map a"中不在"Map b"中的所有值.

这项操作的最快方法是什么?

谢谢

编辑:比较由id完成.因此,如果两个TaskJSO具有相同的id(等于方法被覆盖),则认为它们是相等的.

我的目的是从性能的角度来了解哪种方法最快.例如,如果我在地图中执行"比较"(如彼得所建议的那样),是否有任何区别:

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);
ab.values()
Run Code Online (Sandbox Code Playgroud)

或者如果我使用一套(如Nishant所建议):

Set s = new Hashset();
s.addAll(a.values());
s.addAll(b.values());
Run Code Online (Sandbox Code Playgroud)

Nis*_*ant 13

方法1:

 Set s = new HashSet();
 s.addAll(a.values());
 s.addAll(b.values());
Run Code Online (Sandbox Code Playgroud)

Set是唯一对象的集合.请参阅:http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashSet.html


方法2:

将比较键,如果找到相同的键 - 该值将被后面的Map的值覆盖.

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);
ab.values()
Run Code Online (Sandbox Code Playgroud)

现在,无论是什么情况......比较将使用equals.因此,Method-1将调用equals所有值,Method2将在所有键上调用它.根据比较的复杂程度,性能会有所不同.

在方法1中,您需要创建一个新的Set,但它确保具有相同键的不同值不会被覆盖.但是如果你有唯一的ID,方法2很聪明.

问题更新后编辑#1更新


Pet*_*rey 9

如果你想要b中的所有键/值加上a中的所有值,而不是b.

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);
Run Code Online (Sandbox Code Playgroud)

从a的副本开始,替换或添加b中的所有键/值.

  • @ryanprayogo,失败是什么意思?`a`和`b`可以有相同的键,putAll()将保留'b`中存在重复的值. (2认同)