use*_*714 6 java collections copy arraylist deep-copy
我知道这是一件小事,但我想问这个问题.假设我有一个返回对象ArrayList的get方法.首先,我们必须返回它的副本吗?如果是这样,它是否必须是ArrayList的深层副本?当内部的对象是不可变的时,我们还需要做一个深层复制吗?如果我们使用这种类型的构造函数
ArrayList<T> arr = new ArrayList<>(collection);
Run Code Online (Sandbox Code Playgroud)
然后是复制的数组元素还是仍指向旧值?谢谢
这取决于您的使用案例.有时需要暴露底层集合,有时则不然.
例如,如果您想要利用类的集合方法,则可以返回基础集合(或底层集合的可修改视图).例如,这使您的班级客户能够这样做
phoneBook.getPeople().removeIf(Person::isAddressInvalid);
Run Code Online (Sandbox Code Playgroud)
如果你不希望暴露底层集合我会去
return new ArrayList<>(yourCollection);
Run Code Online (Sandbox Code Playgroud)
我认为在get方法中返回深层副本非常罕见.