【问题标题】:What is the difference between Map.putAll() and Map.clone() methods?Map.putAll() 和 Map.clone() 方法有什么区别?
【发布时间】:2019-05-26 23:36:14
【问题描述】:

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

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

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());

}

}

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

【问题讨论】:

  • 他们根本不做同样的事情。 putAll 将一个地图的所有元素放入另一个地图。 clone 创建地图的副本(克隆)。在一张纸上写东西和复印一张纸之间也有同样的区别。
  • 您正在使用两种不同的方法来完成同一件事。但是请考虑map2 是否已经包含三个元素,然后您使用了addAll。那么map2map3 将不相等

标签: java hashmap clone


【解决方案1】:

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

一般来说,必须假设Map.clone() 会抛出CloneNotSupportedException,因为这是继承自类Object 的行为,而Map 接口没有指定不同的行为。但是,HashMap 特别提供了一个clone() 方法,该方法创建一个新的、浅表的映射副本,在该副本上调用它。请注意,像HashMap.clone() 那样创建新映射与像Map.putAll() 那样向现有映射添加条目之间存在很大差异,尽管在@ 的目标映射的情况下意义不大987654330@ 最初为空。

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

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2010-09-14
    • 2016-05-03
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多