Map.putAll()和Map.clone()方法有什么区别?

时间:2018-12-29 14:34:59

标签: java hashmap clone

我想弄清楚这两种方法的优缺点。

我试图在此处和其他一些站点上找到有关此信息的信息,但是我没有找到这些特定信息。

import java.util.HashMap;
import java.util.Map;

public class Maps {
    private Map<Integer, String> map = new HashMap<>();
    private HashMap<Integer, String> map2 = new HashMap<>();
    private Map<Integer, String> map3 = new HashMap<>();

private void initialization() {
    map.put(1, "Hello");
    map.put(2, "everyone!");
    map.put(3, "Nice to");
    map.put(4, "meet you");
}

public static void main(String[] args) {
    Maps exe = new Maps();
    exe.initialization();
    exe.map2.putAll(exe.map);
    exe.map3 = (Map<Integer, String>) exe.map2.clone();
    System.out.println(exe.map2.values());
    System.out.println(exe.map3.values());

}

}

我得到相同的结果,但是我对应该使用一种或另一种方法的情况感兴趣。

1 个答案:

答案 0 :(得分:1)

Map.putAll()将所有从参数的映射添加到在其上被调用的 existing 映射。如果目标映射已经具有相同键的映射,则将替换原始映射。所有其他键的映射将保留。

通常,必须假设Map.clone()会抛出CloneNotSupportedException,因为这是从类Object继承的行为,并且Map接口没有指定其他值行为。但是,HashMap特别提供了一种clone()方法,该方法创建在其上被调用的地图的新的浅表副本。很好地注意,像创建HashMap.clone()一样创建新地图与像Map.putAll()那样将条目添加到现有地图之间有很大的区别,尽管在目标为目标的情况下意义不大putAll()的映射最初为空。

当您要创建Map的副本时,通常最好选择一个合适的实现类,并通过接受源映射作为参数的构造函数实例化它。不能保证存在这样的构造函数,但是强烈建议将其用作通用Map实现,并且Java标准库中的每个此类实现都提供一个。实例化一个新的空映射,然后使用putAll()进行填充是另一个选择。安全地使用clone()要求您知道自己正在使用支持该功能的Map实现,因此很少可以安全地clone()但无法正常实例化合适的地图。