我有这样的代码:
this.elements = elements;
elements
是List
的位置。是复制列表还是只是指针复制,两者都代表相同的列表?
答案 0 :(得分:13)
这是另一个引用,两者都代表相同的列表。在java中,指针的概念对程序员是隐藏的。它只是处理指针的JVM。
答案 1 :(得分:5)
this.elements和elements都只是同一个列表的标识符,不会被复制
答案 2 :(得分:2)
两者都代表相同的列表,Java中的所有对象都是引用,并且这样传递,因此修改对象会通过引用进行修改。
答案 3 :(得分:0)
正如其他人所说,它只会复制参考文献。如果您希望复制实际列表,则必须调用clone()
方法:
this.elements = elements.clone();
注意:这是否具有所需效果仍然取决于列表中的对象是什么,因为它们本身可能是对可变对象的引用。
答案 4 :(得分:0)
它本质上是一个“指针副本”。 Java中正确的术语是引用,而不是指针。一个重要的区别是Java引用的值不是内存地址,它直接指向JVM堆中的对象。
如果你想要一个副本,你有几个选择,但可以说最好的是:
this.elements = ImmutableList.copyOf(elements);
此技术使用Google Guava创建无法更改的列表。如果您想要一个可以修改的列表,请改为:
this.elements = Lists.newArrayList(elements);
还有“内置”clone()
方法,但that has a few pitfalls to watch out for (Effective Java, 2nd ed., Item 10)。