让我说我做:
public ListgimmeAList(List original) { return new ArrayList (original); // this is a shallow memcopy. }
我尝试修改新列表,但由于字符串(或任何不可变对象)是不可变的,执行类似的操作:gimmeAList(something).get(0).replace("a", "b");
实际上似乎不会更改任何列表中的任何内容.
所以在这种情况下,我是否可以假设(对于列表中的不可变对象)new ArrayList
,对于所有意图和目的,保证基本上是一个深层副本?
是的,绝对 - 复制一组不可变对象实际上很深,除非你做了一些疯狂的事情,比如在引用上进行同步或比较它们以获得引用相等性(即依赖于对象标识的操作).