开发者社区 问答 正文

ava数组的克隆方法

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

例如:

int[] a = {1,2,3}; int[] b = a.clone(); 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 14:01:53 388 分享 版权
1 条回答
写回答
取消 提交回答
  • 在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
    

    如果您通常了解对象引用的工作方式,那么很容易理解克隆和修改如何影响对象数组。为了进一步了解参考文献和原语,建议您阅读这篇出色的文章。

    2020-02-09 14:02:04
    赞同 展开评论
问答分类:
问答地址: