Java ArrayList副本
我有一个大小为10的ArrayList
l1
。我将l1
分配给新的列表引用typesl2
。 将l1
和l2
指向相同的ArrayList
对象? 或者是分配给l2
的ArrayList
对象的副本?
当使用l2
引用时,如果我更新了列表对象,它也反映了l1
引用types的变化。
例如:
List<Integer> l1 = new ArrayList<Integer>(); for (int i = 1; i <= 10; i++) { l1.add(i); } List l2 = l1; l2.clear();
除了创build2个列表对象,并且对从旧集合到新集合的拷贝,除了创build2个列表对象外,没有其他方法可以将列表对象的副本分配给新的引用variables吗?
是的,赋值只是将l1
(这是一个引用)的值复制到l2
。 他们都会提到同一个对象。
虽然创build一个浅拷贝是非常容易的:
List<Integer> newList = new ArrayList<>(oldList);
(就像一个例子)
尝试使用Collections.copy(destination, source);
是的l1
和l2
将指向相同的参考,相同的对象。
如果你想创build一个基于另一个ArrayList的新的ArrayList,你可以这样做:
List<String> l1 = new ArrayList<String>(); l1.add("Hello"); l1.add("World"); List<String> l2 = new ArrayList<String>(l1); //A new arrayList. l2.add("Everybody");
结果是l1
仍然有2个元素, l2
将有3个元素。
将src ArrayList中的值复制到dest Arraylist的另一种方便方法如下:
ArrayList<String> src = new ArrayList<String>(); src.add("test string1"); src.add("test string2"); ArrayList<String> dest= new ArrayList<String>(); dest.addAll(src);
这是值的实际复制,而不仅仅是复制参考。
Java不传递对象,它传递对象的引用(指针)。 所以是的,l2和l1是两个指向同一个对象的指针。
如果需要两个具有相同内容的不同列表,则必须进行明确的复制。
有一个方法addAll()将用于将一个ArrayList复制到另一个ArrayList的目的。
例如,你有两个数组列表: sourceList和targetList ,使用下面的代码。
targetList.addAll(SOURCELIST);
- 在Java 8中,为什么ArrayList的默认容量现在为零?
- ArrayList <String>到CharSequence
- 如何以同样的方式随机化两个ArrayList?
- 为什么ArrayList没有标记?
- 铸造Arrays.asList导致exception:java.util.Arrays $ ArrayList不能转换为java.util.ArrayList
- 使arrayList.toArray()返回更具体的types
- 使用自定义sorting顺序对对象的ArrayList进行sorting
- 我如何检查两个ArrayList是否有所不同,我不在乎发生了什么变化
- 如何在Java中对ArrayList进行sorting