在ArrayList中使用clone()方法,为什么选择Arrays.copyOf()?

时间:2015-02-07 22:20:23

标签: java arraylist clone

我尝试用我自己的ArrayList来直接克隆Java。

我看到这段代码

@Override
public Object clone() {
    try {
        MyArrayList<E> v = (MyArrayList<E>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        return v;
    } catch (CloneNotSupportedException e) {
        throw new InternalError();
    }
}

提供与

相同的结果
@Override
public Object clone() {
    try {
        return (MyArrayList<E>) super.clone();
    } catch (CloneNotSupportedException e) {
        throw new InternalError();
    }
}

我做错了什么或者为什么要使用Arrays.copyOf()?

1 个答案:

答案 0 :(得分:3)

不,它没有,第一种方法创建了底层数组的副本(注意:它是数组的副本 - 而不是数组中的对象!)。

后者创建一个ArrayList,指向与原始对象相同的数组。

示例:

    String[][] s1 = {{new String("a"), new String("b")}};
    String[][] s2 = s1.clone();
    System.out.println(Arrays.toString(s1)); // prints [[Ljava.lang.String;@7440e464]
    System.out.println(Arrays.toString(s2)); // prints [[Ljava.lang.String;@7440e464]
    System.out.println(s1[0] == s2[0]); // prints true
    System.out.println(s1 == s2); // prints false - because s2 != s1

由于数组数组是一个对象,并且第一个项目(s[0])是一个数组本身(也是一个对象) - 你可以看到克隆只是将引用复制到了对象。