ArrayList 中的 clone() 方法,为什么是 Arrays.copyOf()?

clone() method in ArrayList, why Arrays.copyOf()?

我试着弄清楚如何使用我自己的 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()?

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

后者创建一个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]) 本身就是一个数组(也是一个对象)——你可以看到克隆只是复制了引用到对象。