Java 数组的克隆方法
Java 中的 clone() 方法在数组上使用时究竟返回了什么?它是否返回一个包含从原始数组复制的数据的新数组?
前任:
int[] a = {1,2,3};
int[] b = a.clone();
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
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)
这意味着,如果我们修改通过克隆数组访问的对象,则当我们访问源数组中的同一对象时,更改将反映出来,因为它们指向相同的引用。
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
如果您大致了解对象引用的工作原理,就很容易理解对象数组如何受到克隆和修改的影响。为了进一步了解引用和原语,我建议阅读这篇优秀的文章。
clone()
方法创建并返回此对象的副本。“复制”的确切含义可能取决于对象的类。一般的意图是,对于任何对象 x,表达式:
x.clone() != x
将为 true,并且表达式:
x.clone().getClass() == x.getClass()
会是真的,但这些不是绝对的要求。
虽然通常的情况是:
x.clone().equals(x)
会是真的,这不是绝对的要求。
按照约定,返回的对象应通过调用 来获取。如果一个类及其所有超类(Object 除外)都遵守此约定,则情况将是 .super.clone
x.clone().getClass() == x.getClass()