【发布时间】:2019-07-17 23:31:28
【问题描述】:
我的问题是我需要复制一个列表,但需要一个深拷贝。当我修改列表a 时,我不想修改列表b。我使用JDK11,所以我可以使用list.copyOf,但是当我修改a时,b也被修改了。我做错了吗?
b = List.copyOf(a);
System.out.println("A start:" + b.get(2).getSeating());
System.out.println("B start:" + b.get(2).getSeating());
a.get(2).setSeating(27);
System.out.println("Hi there" );
System.out.println("A end:" + a.get(2).getSeating());
System.out.println("B end:" + b.get(2).getSeating());
该分配的输出:
【问题讨论】:
-
“我做错了什么吗?” 是的,你错误地认为
List.copyOf()是一个深拷贝。 javadoc 没有提到深拷贝,那你为什么相信呢? -
返回一个不可修改的列表,其中包含给定集合的元素,按其迭代顺序。给定的 Collection 不得为 null,并且不得包含任何 null 元素。如果随后修改了给定的 Collection,则返回的 List 将不会反映此类修改。
-
是的,javadoc 就是这么说的。它没有说它正在做一个深拷贝。它正在将 references 复制到列表中的元素,而不是元素本身。复制的 list 是不可修改的。元素不是,它们在旧列表和新列表之间共享。这就是浅拷贝的意思。所以我再问一次,为什么你认为
copyOf是在进行deep 复制?或者我应该问你是否知道什么是深拷贝? -
我知道深拷贝是什么意思,但我认为 java 应该提供一种更简单的方法来做到这一点,因为有时拥有原件来修改元素和原件很重要,以防你想要原始值。
-
Java 确实有一个简单的方法来做到这一点,
clone()方法,但只有 你 可以确定如何正确复制对象,即哪些字段需要深- 已复制,所以你需要告诉Java如何做的细节。