我想弄清楚这两种方法的优缺点。
我试图在此处和其他一些站点上找到有关此信息的信息,但是我没有找到这些特定信息。
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());
}
}
我得到相同的结果,但是我对应该使用一种或另一种方法的情况感兴趣。
答案 0 :(得分:1)
Map.putAll()
将所有从参数的映射添加到在其上被调用的 existing 映射。如果目标映射已经具有相同键的映射,则将替换原始映射。所有其他键的映射将保留。
通常,必须假设Map.clone()
会抛出CloneNotSupportedException
,因为这是从类Object
继承的行为,并且Map
接口没有指定其他值行为。但是,HashMap
特别提供了一种clone()
方法,该方法创建在其上被调用的地图的新的浅表副本。很好地注意,像创建HashMap.clone()
一样创建新地图与像Map.putAll()
那样将条目添加到现有地图之间有很大的区别,尽管在目标为目标的情况下意义不大putAll()
的映射最初为空。
当您要创建Map
的副本时,通常最好选择一个合适的实现类,并通过接受源映射作为参数的构造函数实例化它。不能保证存在这样的构造函数,但是强烈建议将其用作通用Map
实现,并且Java标准库中的每个此类实现都提供一个。实例化一个新的空映射,然后使用putAll()
进行填充是另一个选择。安全地使用clone()
要求您知道自己正在使用支持该功能的Map
实现,因此很少可以安全地clone()
但无法正常实例化合适的地图。>