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

时间:2011-04-28 16:23:31

标签: java clone

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

4 个答案:

答案 0 :(得分:76)

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

您可能希望使用Arrays.copyOf(..)来复制数组而不是clone()(尽管克隆适用于数组,与其他任何内容不同)

如果您想深度克隆,check this answer


一个小例子来说明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("-----");
}

打印:

4384790  
4384790
9634993  
-----  
1641745  
1641745  
11077203  
-----  

答案 1 :(得分:19)

  

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

不会克隆数组的元素。

  

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

  

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

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

答案 2 :(得分:6)

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

请记住,由于clone()的浅拷贝实现,2D数组克隆无法正常工作。

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
}

答案 3 :(得分: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));                                                               
    }                                                                                                                                                    
}