其次,我自己比较了一下ArrayList的clone()方法以及new ArrayList(List)的构造方法,即:
(1)List<E> clone = list.clone();
(2)List<E> clone2 = new ArrayList<E>(list);
发现两者效率比较奇葩:
当元素个数少于几十万级别的时候,两个效率大体相当,总体来说(2)的效率要高一点点;
当元素个数100W-300W的时候,(2)的效率比(1)高
当元素个数400W-500W的时候,(1)的效率比(2)高不少
当元素大于600W的时候,总体上(2)的效率又比(1)高
但是当到达1200W-1300W的时候,(1)的效率比(2)高不少
ps:效率的统计方式很土long begin = System.currentTimeMillis(); 再有个end 相减就得到执行时间
上面的规律我测试了几次,虽然有些变化,但是貌似总体趋势是这样。
有没有高人可以解释一下,或者有其他深拷贝的方法比(2)的效率高一些
7 个解决方案
#1
这两个都是浅拷贝把,以下是我jdk中的源代码:
public Object clone() {
try {
@SuppressWarnings("unchecked")
ArrayList<E> v = (ArrayList<E>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
两个都是只拷贝了源数组而没有拷贝数组中元素所指向的对象。
public Object clone() {
try {
@SuppressWarnings("unchecked")
ArrayList<E> v = (ArrayList<E>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
两个都是只拷贝了源数组而没有拷贝数组中元素所指向的对象。
#2
Arrays.copyof不是直接拷贝数组的内存块么?
不会是浅拷贝吧
求解释
不会是浅拷贝吧
求解释
#3
懂了 懂了。。。
#4
不过我现在做的事情,也只需要做一层深拷贝就行,求问有更高效的办法么?
#5
Works Applications????
#6
Works Applications++;
#7
深拷贝用序列化反序列化
#1
这两个都是浅拷贝把,以下是我jdk中的源代码:
public Object clone() {
try {
@SuppressWarnings("unchecked")
ArrayList<E> v = (ArrayList<E>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
两个都是只拷贝了源数组而没有拷贝数组中元素所指向的对象。
public Object clone() {
try {
@SuppressWarnings("unchecked")
ArrayList<E> v = (ArrayList<E>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
两个都是只拷贝了源数组而没有拷贝数组中元素所指向的对象。
#2
Arrays.copyof不是直接拷贝数组的内存块么?
不会是浅拷贝吧
求解释
不会是浅拷贝吧
求解释
#3
懂了 懂了。。。
#4
不过我现在做的事情,也只需要做一层深拷贝就行,求问有更高效的办法么?
#5
Works Applications????
#6
Works Applications++;
#7
深拷贝用序列化反序列化