Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用ArrayList时的深度复制_Java_Arraylist_Collections_Copy_Deep Copy - Fatal编程技术网

在java中使用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(集合); 那么数组的元素是被复制的还是仍然指向旧值? 谢

我知道这是一件小事,但我想问这个问题。假设我有一个get方法,它返回一个对象的ArrayList。首先,我们必须返回它的副本吗?如果是这样,它是否必须是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);绝对地字符串是不可变的,因此返回字符串的深度副本特别没有意义。