gpt4 book ai didi

java - Java 数组的克隆方法

转载 作者:IT老高 更新时间:2023-10-28 20:24:23 24 4
gpt4 key购买 nike

Java 中的 clone() 方法在数组上使用时究竟返回什么?它是否返回一个包含从原始数据复制的数据的新数组?

例如:

int[] a = {1,2,3};
int[] b = a.clone();

最佳答案

当对数组调用 clone 方法时,它会返回对包含(或引用)与源数组相同元素的新数组的引用。

因此,在您的示例中,int[] a 是在堆上创建的单独对象实例,而 int[] b 是在堆上创建的单独对象实例。 (记住所有数组都是对象)。

    int[] a = {1,2,3};
int[] b = a.clone();

System.out.println(a == b ? "Same Instance":"Different Instance");
//Outputs different instance

如果要修改 int[] b,则更改不会反射(reflect)在 int[] a 上,因为两者是单独的对象实例。

    b[0] = 5;
System.out.println(a[0]);
System.out.println(b[0]);
//Outputs: 1
// 5

当源数组包含对象时,这会变得稍微复杂一些。 clone 方法将返回对新数组的引用,该数组引用与源数组相同的对象。

所以如果我们有类 Dog...

    class Dog{

private String name;

public Dog(String name) {
super();
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

然后我创建并填充了一个 Dog...

类型的数组
    Dog[] myDogs = new Dog[4];

myDogs[0] = new Dog("Wolf");
myDogs[1] = new Dog("Pepper");
myDogs[2] = new Dog("Bullet");
myDogs[3] = new Dog("Sadie");

然后克隆狗……

    Dog[] myDogsClone = myDogs.clone();

数组引用相同的元素...

    System.out.println(myDogs[0] == myDogsClone[0] ? "Same":"Different");
System.out.println(myDogs[1] == myDogsClone[1] ? "Same":"Different");
System.out.println(myDogs[2] == myDogsClone[2] ? "Same":"Different");
System.out.println(myDogs[3] == myDogsClone[3] ? "Same":"Different");
//Outputs Same (4 Times)

这意味着如果我们修改通过克隆数组访问的对象,则更改将在我们访问源数组中的相同对象时反射(reflect)出来,因为它们指向相同的引用。

    myDogsClone[0].setName("Ruff"); 
System.out.println(myDogs[0].getName());
//Outputs Ruff

但是,对数组本身的更改只会影响该数组。

    myDogsClone[1] = new Dog("Spot");
System.out.println(myDogsClone[1].getName());
System.out.println(myDogs[1].getName());
//Outputs Spot
// Pepper

如果您大致了解对象引用的工作原理,就很容易理解对象数组如何受到克隆和修改的影响。为了进一步了解引用和原语,我建议阅读这篇优秀的 article .

Gist of Source Code

关于java - Java 数组的克隆方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com