Java数组的克隆方法

Java数组的克隆方法,java,arrays,clone,Java,Arrays,Clone,当在数组上使用时,Java中的clone()方法究竟返回什么? 它是否返回一个新数组,其中包含从原始数组复制的数据 例: 当对数组调用clone方法时,它返回对新数组的引用,该数组包含(或引用)与源数组相同的元素 因此,在您的示例中,int[]a是在堆上创建的单独对象实例,int[]b是在堆上创建的单独对象实例。(请记住,所有数组都是对象) 如果要修改int[]b,则更改不会反映在int[]a上,因为这两个对象实例是独立的 b[0] = 5; System.out.println

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

例:


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

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

如果要修改
int[]b
,则更改不会反映在
int[]a
上,因为这两个对象实例是独立的

    b[0] = 5;
    System.out.println(a[0]);
    System.out.println(b[0]);
    //Outputs: 1
    //         5
当源数组包含对象时,这会稍微复杂一些。
clone
方法将返回对新数组的引用,该数组引用与源数组相同的对象

因此,如果我们有类

    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[] 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
的数组

    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[] 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
 x.clone().getClass() == x.getClass()
将为真,并且表达式:

 x.clone() != x
 x.clone().getClass() == x.getClass()
是的,但这些不是绝对的要求

而通常情况下:

 x.clone().equals(x)
是的,这不是绝对的要求


按照惯例,返回的对象应该通过调用
super.clone
获得。如果一个类及其所有超类(对象除外)都遵守此约定,则情况将是
x.clone().getClass()==x.getClass()

您是否检查了文档并亲自尝试过?混淆之处是什么?通过以下链接了解clone()。和。这些链接将点亮您提出的问题。这似乎与建议的问题不同,建议的问题专门询问有关克隆数组引用的对象的问题。这个问题并没有问这个问题,它的例子是一个基元数组。@andythonas如果重新打开是正确的,请删除指向副本的链接,否则请重新关闭这个问题。我听说使用
.remove()
不会影响原始数组。只有变异的
方法才会影响原始数组。这是正确的吗?这只是
j.l.Object
上的
clone()
方法的javadoc的一个练习,我看不出它是如何回答这个问题的。