Java ArrayList副本

我有一个大小为10的ArrayList l1 。我将l1分配给新的列表引用typesl2 。 将l1l2指向相同的ArrayList对象? 或者是分配给l2ArrayList对象的副本?

当使用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);

是的l1l2将指向相同的参考,相同的对象。

如果你想创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的目的。

例如,你有两个数组列表: sourceListtargetList ,使用下面的代码。

targetList.addAll(SOURCELIST);