我尝试用我自己的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()?
答案 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]
)是一个数组本身(也是一个对象) - 你可以看到克隆只是将引用复制到了对象。