我不知道在Java中复制列表是如何工作的。我有这个代码:
List<String> copy = new ArrayList<String>(original);
这会创建一个名为 copy 的新列表,只保存对原始列表中对象的引用吗?(这就是我想要的)。或者它会创建新的字符串对象并耗尽不必要的内存吗?
当我从复制列表中删除项目时,这只会删除引用而不从两个列表中删除对象吗?
感谢您的阅读!
copy
列表将包含对相同String
对象的引用。 这称为浅拷贝。 它不会创建元素的副本;它将创建对元素的引用的副本。
original --> [ + + + ]
| | |
v v v
"one" "two" "three"
^ ^ ^
| | |
copy --> [ + + + ]
从一个列表中删除项目时,仅从该列表中删除引用。 其他列表中的相应引用仍然完好无损。
original --> [ + + + ]
| | |
v v v
"one" "two" "three"
^ ^
| |
copy --> [ + + ]
它创建一个全新的 ArrayList,其中填充了原始的 String 对象。您可以通过使用 ==
运算符来比较实例("内存位置")来验证这一点:
original.get(0) == copy.get(0) // true
.remove
方法仅从要调用它的列表中删除该元素。它不会在任何地方使用它(而且你实际上不能在 Java 中做到这一点)。而且由于copy
列表是一个全新的列表,而不是由original
列表"支持",因此从原始列表中删除某些内容不会影响副本。