List li2 = new ArrayList(li.size()); //这里只是说明li2的容纳能力,但比不表示li2的size是li.size(),所以size不足,发生数组越界了List li = new ArrayList(); for(int i = 0; i<=9; i++){ li.add( "a "+i); } List li2 = new ArrayList(li.size()); //这里没意义 System.out.println(li2.size()); //打印size情况就知道了 li2 = new ArrayList(Arrays.asList(li.toArray(new Object[0]))); //这样才能保证size一致 //for (int i=0; i<li.size(); i++) {li2.add("");} //或者用这样的方式来保证li2的size Collections.copy(li2,li); System.out.println(li2);
所谓深拷贝,浅拷贝是指新的引用变量是引用和拷贝源不同的内存地址还是相同的内存地址 如 A a; A b = a.copy(); 如果 b 和 a 引用同一个对象的内存地址,那么说这样的复制属于 浅拷贝 如果 b 和 a 引用的对象不是同一个内存地址,即 b 和 a 分别引用不同的对象,只是两个不同的对象的内容相同,那么这样的复制就叫做深拷贝。采用Collections.copy是深拷贝,即li2保存的元素和li的元素是不同的对象,但是内容相同,所以要保证li2的size至少和li的size一样(大于没问题,小于就发生越界) 而 List li2 = new ArrayList(li); //这样是浅拷贝,即li2保存的元素和li的元素是相同的对象
哦, li2 = new ArrayList(Arrays.asList(li.toArray(new Object[0]))); 受教了 那么浅复制又是怎么回事呢?
但是ArrayList类里的size变量没有用initialCapacity赋值,所以ArrayList(10)的长度其实还是0,
难道是ArrayList的一个bug?
for(int i = 0; i<=9; i++){
li.add( "a "+i);
}
List li2 = new ArrayList(li.size()); //这里没意义
System.out.println(li2.size()); //打印size情况就知道了
li2 = new ArrayList(Arrays.asList(li.toArray(new Object[0]))); //这样才能保证size一致
//for (int i=0; i<li.size(); i++) {li2.add("");} //或者用这样的方式来保证li2的size
Collections.copy(li2,li);
System.out.println(li2);
如
A a;
A b = a.copy();
如果 b 和 a 引用同一个对象的内存地址,那么说这样的复制属于 浅拷贝
如果 b 和 a 引用的对象不是同一个内存地址,即 b 和 a 分别引用不同的对象,只是两个不同的对象的内容相同,那么这样的复制就叫做深拷贝。采用Collections.copy是深拷贝,即li2保存的元素和li的元素是不同的对象,但是内容相同,所以要保证li2的size至少和li的size一样(大于没问题,小于就发生越界)
而 List li2 = new ArrayList(li); //这样是浅拷贝,即li2保存的元素和li的元素是相同的对象
li2 = new ArrayList(Arrays.asList(li.toArray(new Object[0])));
受教了
那么浅复制又是怎么回事呢?