数组列表l1的大小是10。我将l1赋值给新列表引用类型l2。l1和l2指向同一个数组列表对象吗?还是数组列表对象的副本赋值给了l2?

当使用l2引用时,如果我更新列表对象,它也会反映l1引用类型的变化。

例如:

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

List l2 = l1;
l2.clear();

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


当前回答

只是为了完成: 上面所有的答案都是浅层复制——保持原始对象的引用。如果你想要一个深度拷贝,你的(引用)类在列表中必须实现一个 克隆/复制方法,它提供单个对象的深度副本。然后你可以使用:

newList.addAll(oldList.stream().map(s->s.clone()).collect(Collectors.toList()));

其他回答

只是为了完成: 上面所有的答案都是浅层复制——保持原始对象的引用。如果你想要一个深度拷贝,你的(引用)类在列表中必须实现一个 克隆/复制方法,它提供单个对象的深度副本。然后你可以使用:

newList.addAll(oldList.stream().map(s->s.clone()).collect(Collectors.toList()));

l1和l2指向同一个引用,同一个对象。

如果你想在另一个数组列表的基础上创建一个新的数组列表,你可以这样做:

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个元素。

是的,赋值只是将l1的值(这是一个引用)复制到l2。它们都指向同一个对象。

创建一个浅拷贝非常简单:

List<Integer> newList = new ArrayList<>(oldList);

(这只是一个例子。)

将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);

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

尝试使用集合。复制(目的地,来源);