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]
) 本身就是一个数组(也是一个对象)——你可以看到克隆只是复制了引用到对象。
我试着弄清楚如何使用我自己的 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]
) 本身就是一个数组(也是一个对象)——你可以看到克隆只是复制了引用到对象。