📜  Java HashMap clone()(1)

📅  最后修改于: 2023-12-03 14:42:14.344000             🧑  作者: Mango

Java HashMap clone()

clone() 方法用于创建并返回当前 HashMap 对象的浅表副本。这意味着该方法返回的新 HashMap 对象与原始 HashMap 对象共享相同的键值映射。

语法
public Object clone()
参数

无参数。

返回值

该方法返回当前 HashMap 对象的浅表副本。

特点
  • 浅表副本:新对象中所包含的所有元素都是原始对象的元素的副本。但是,如果元素本身是引用,则新对象和原始对象中都包含对该引用的副本。这意味着如果更改任一对象中的引用,那么另一个对象也会更改。
  • 共享相同键值映射:如果新对象或原始对象更改了映射中的值,则另一个对象的映射值也将更改。
示例
import java.util.HashMap;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
    // 创建 HashMap 对象
    HashMap<String, String> originalMap = new HashMap<String, String>();
    originalMap.put("1", "one");
    originalMap.put("2", "two");
    originalMap.put("3", "three");

    // 创建原始对象的浅表副本
    Map<String, String> clonedMap = (Map<String, String>) originalMap.clone();

    // 输出原始 HashMap 对象和浅表副本
    System.out.println("Original HashMap: " + originalMap);
    System.out.println("Cloned HashMap: " + clonedMap);

    // 更改原始 HashMap 对象中的一个值
    originalMap.put("1", "ONE");

    // 另一个对象的值也会更改
    System.out.println("Original HashMap: " + originalMap);
    System.out.println("Cloned HashMap: " + clonedMap);

    // 更改浅表副本对象中的一个值
    clonedMap.put("2", "TWO");

    // 另一个对象的值也会更改
    System.out.println("Original HashMap: " + originalMap);
    System.out.println("Cloned HashMap: " + clonedMap);

  }
}

输出结果如下:

Original HashMap: {1=one, 2=two, 3=three}
Cloned HashMap: {1=one, 2=two, 3=three}
Original HashMap: {1=ONE, 2=two, 3=three}
Cloned HashMap: {1=ONE, 2=two, 3=three}
Original HashMap: {1=ONE, 2=two, 3=three}
Cloned HashMap: {1=ONE, 2=TWO, 3=three}

从结果可以看出,如果更改原始 HashMap 对象或浅表副本,则另一个对象的映射值也会更改。这是因为它们共享相同的键值映射。

注意事项
  • 如果在克隆 HashMap 对象之后更改了元素,那么新对象和原始对象中对该元素的引用都将发生更改。这意味着原始 HashMap 对象和浅表副本之间的更改不是相互独立的。
  • clone() 方法返回的是一个 Object 类型的对象,需要强制类型转换为 HashMap 对象。
  • 即使我们复制了一个 HashMap 实例,所有的元素也不是克隆出的,而只是插入了不具有实际对象而克隆引用的空值。换句话说,克隆出的元素只是保留其索引和类型的占位符。如果添加克隆后对原始 HashMap 做出更改,克隆对象中的元素也会更改,因为 HashMap 仍然引用了键值对的相同内部对象。