在java中使用ArrayList时的深层复制

use*_*714 6 java collections copy arraylist deep-copy

我知道这是一件小事,但我想问这个问题.假设我有一个返回对象ArrayList的get方法.首先,我们必须返回它的副本吗?如果是这样,它是否必须是ArrayList的深层副本?当内部的对象是不可变的时,我们还需要做一个深层复制吗?如果我们使用这种类型的构造函数

ArrayList<T> arr = new ArrayList<>(collection);
Run Code Online (Sandbox Code Playgroud)

然后是复制的数组元素还是仍指向旧值?谢谢

aio*_*obe 5

这取决于您的使用案例.有时需要暴露底层集合,有时则不然.

例如,如果您想要利用类的集合方法,则可以返回基础集合(或底层集合的可修改视图).例如,这使您的班级客户能够这样做

phoneBook.getPeople().removeIf(Person::isAddressInvalid);
Run Code Online (Sandbox Code Playgroud)

如果你希望暴露底层集合我会去

return new ArrayList<>(yourCollection);
Run Code Online (Sandbox Code Playgroud)

我认为在get方法中返回深层副本非常罕见.

  • 绝对.字符串是不可变的,因此返回字符串的深层副本尤其毫无意义. (2认同)