Java ArrayList副本

use*_*281 200 java arraylist

我有一个ArrayList l1大小10.我分配l1给新列表引用类型l2.威尔l1l2指向同一个ArrayList对象吗?或者是ArrayList分配给的对象的副本l2

使用l2引用时,如果我更新列表对象,它也会反映l1引用类型中的更改.

例如:

List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
    l1.add(i);
}

List l2 = l1;
l2.clear();
Run Code Online (Sandbox Code Playgroud)

除了创建2个列表对象以及对从旧到新的集合进行复制之外,没有其他方法可以将列表对象的副本分配给新的引用变量吗?

Jon*_*eet 429

是的,分配将刚刚复制l1(这是引用)l2.它们都会引用同一个对象.

创建浅拷贝非常简单:

List<Integer> newList = new ArrayList<>(oldList);
Run Code Online (Sandbox Code Playgroud)

(就像一个例子.)

  • @Cat:不......这只是一个浅薄的副本. (3认同)

Ser*_*huk 67

尝试使用 Collections.copy(destination, source);

  • 这种方法非常误导!实际上,它的描述是.它说:"将元素从一个源列表复制到目标",但它们不会被复制!它们被引用,因此只有1个对象的副本,如果它们是可变的,那你就麻烦了 (13认同)
  • 注意解释为什么这可能比`new ArrayList <>(source)更好;`? (11认同)
  • @atc它是另一种做浅层复制的方法,而不是新的ArrayList()它使用了另一种算法,可以用于任何List实现,而不仅仅用于ArrayList,这就是全部:) (4认同)
  • 在java-api中没有任何地方深度克隆是由任何集合类完成的 (3认同)
  • 这个答案没有多大意义。`Collections.copy` 根本不是 `new ArrayList&lt;&gt;(source)` 的替代品。`Collections.copy` 实际所做的是假设 `destination.size()` 至少与 `source.size()` 一样大,然后使用 `set(int,E )` 方法。该方法不会*添加*新元素到目的地。[如果Javadoc不够清楚,请参阅源代码。](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Collections .java#l596) (3认同)

Alf*_*rio 31

是的l1并且l2将指向相同的参考,相同的对象.

如果要基于另一个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");
Run Code Online (Sandbox Code Playgroud)

结果将l1仍然有2个元素,l2并将有3个元素.


Har*_*are 19

将值从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);
Run Code Online (Sandbox Code Playgroud)

这是对值的实际复制,而不仅仅是复制引用.

  • 我不完全确定这是准确的.我的测试显示相反(仍然引用相同的对象) (10认同)
  • 这个答案是错误的。addAll() 只是像 invertigo 所说的那样复制引用。这不是深拷贝。 (2认同)

小智 7

有一个方法addAll(),它将用于将One ArrayList复制到另一个ArrayList.

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

targetList.addAll(SOURCELIST);