在数组上调用clone()是否也克隆其内容?

Szy*_*mon 91 java clone

如果我clone()在类型A的对象数组上调用方法,它将如何克隆其元素?该副本是否会引用相同的对象?或者它会(element of type A).clone()为每个人打电话吗?

Boz*_*zho 76

clone()创建一个浅表副本.这意味着不会克隆元素.(如果他们没有实施Cloneable怎么办?)

您可能希望Arrays.copyOf(..)用于复制数组而不是clone()(尽管克隆适用于数组,不像其他任何东西)

如果您想深度克隆,请查看此答案


一个小例子来说明clone()即使元素是Cloneable:

ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()};
ArrayList[] clone = array.clone();
for (int i = 0; i < clone.length; i ++) {
    System.out.println(System.identityHashCode(array[i]));
    System.out.println(System.identityHashCode(clone[i]));
    System.out.println(System.identityHashCode(array[i].clone()));
    System.out.println("-----");
}
Run Code Online (Sandbox Code Playgroud)

打印:

4384790  
4384790
9634993  
-----  
1641745  
1641745  
11077203  
-----  
Run Code Online (Sandbox Code Playgroud)

  • 而且,如果你打算这样做,我个人会使用`System.arrayCopy` (2认同)

Blu*_*zee 19

如果我在类型A的对象数组上调用clone()方法,它将如何克隆其元素?

不会克隆数组的元素.

该副本是否会引用相同的对象?

是.

或者它会为每个人调用(类型A的元素).clone()吗?

不,它不会调用clone()任何元素.


Tha*_*wda 6

1D基元数组在克隆时会复制元素.这诱使我们克隆2D数组(数组数组).

请记住,由于浅拷贝实现,2D阵列克隆不起作用clone().

public static void main(String[] args) {
    int row1[] = {0,1,2,3};
    int row2[] =  row1.clone();
    row2[0] = 10;
    System.out.println(row1[0] == row2[0]); // prints false

    int table1[][]={{0,1,2,3},{11,12,13,14}};
    int table2[][] = table1.clone();
    table2[0][0] = 100;
    System.out.println(table1[0][0] == table2[0][0]); //prints true
}
Run Code Online (Sandbox Code Playgroud)

  • 是的!克隆数组时会复制一维基元数组 (2认同)
  • 请注意 Thamme Gowda N 说的是“原始”。对象数组的克隆只是引用的克隆。 (2认同)

Sim*_*son 5

克隆是数组的浅表副本.

此测试代码打印:

[1, 2] / [1, 2]
[100, 200] / [100, 2]

因为MutableInteger它在两个数组中共享为objects[0]objects2[0],但您可以objects[1]独立地更改引用objects2[1].

import java.util.Arrays;                                                                                                                                 

public class CloneTest {                                                                                                                                 
    static class MutableInteger {                                                                                                                        
        int value;                                                                                                                                       
        MutableInteger(int value) {                                                                                                                      
            this.value = value;                                                                                                                          
        }                                                                                                                                                
        @Override                                                                                                                                        
        public String toString() {                                                                                                                       
            return Integer.toString(value);                                                                                                              
        }                                                                                                                                                
    }                                                                                                                                                    
    public static void main(String[] args) {                                                                                                             
        MutableInteger[] objects = new MutableInteger[] {
                new MutableInteger(1), new MutableInteger(2) };                                                
        MutableInteger[] objects2 = objects.clone();                                                                                                     
        System.out.println(Arrays.toString(objects) + " / " + 
                            Arrays.toString(objects2));                                                                
        objects[0].value = 100;                                                                                                                          
        objects[1] = new MutableInteger(200);                                                                                                            
        System.out.println(Arrays.toString(objects) + " / " + 
                            Arrays.toString(objects2));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
Run Code Online (Sandbox Code Playgroud)