在java中使用ArrayList时的深度复制
我知道这是一件小事,但我想问这个问题。假设我有一个get方法,它返回一个对象的ArrayList。首先,我们必须返回它的副本吗?如果是这样,它是否必须是ArrayList的深度副本?当其中的对象是不可变的时,我们还需要进行深度复制吗? 如果我们使用这种类型的构造函数在java中使用ArrayList时的深度复制,java,arraylist,collections,copy,deep-copy,Java,Arraylist,Collections,Copy,Deep Copy,我知道这是一件小事,但我想问这个问题。假设我有一个get方法,它返回一个对象的ArrayList。首先,我们必须返回它的副本吗?如果是这样,它是否必须是ArrayList的深度副本?当其中的对象是不可变的时,我们还需要进行深度复制吗? 如果我们使用这种类型的构造函数 ArrayList<T> arr = new ArrayList<>(collection); ArrayList arr=新的ArrayList(集合); 那么数组的元素是被复制的还是仍然指向旧值? 谢
ArrayList<T> arr = new ArrayList<>(collection);
ArrayList arr=新的ArrayList(集合);
那么数组的元素是被复制的还是仍然指向旧值?
谢谢这取决于您的用例。有时需要公开底层集合,有时则不然 例如,如果希望利用类的集合方法,可以返回基础集合(或基础集合的可修改视图)。例如,这使类的客户机能够执行以下操作:
phoneBook.getPeople().removeIf(Person::isAddressInvalid);
如果您不想公开底层集合,我会选择
return new ArrayList<>(yourCollection);
返回新的ArrayList(yourCollection);
我认为在get方法中返回深度副本是非常罕见的。好吧,如果类型是String,那么我可以这样返回它:返回新的ArrayList(yourCollection);绝对地字符串是不可变的,因此返回字符串的深度副本特别没有意义。