更好的是:
此
public Move(moveString) {
ArrayList<Square> moveSquares = splitToSquares(moveString.toLowerCase());
this.from = new Square(moveSquares.get(0));
this.to = new Square(moveSquares.get(1));
}
或者这个:
public Move(moveString) {
ArrayList<Square> moveSquares = splitToSquares(moveString.toLowerCase());
this.from = moveSquares.get(0);
this.to = moveSquares.get(1);
}
首先,我使用移动对象中的信息创建一个新信息。 在第二个中,我直接使用该对象。
现在我的程序没有多大区别,但我想知道Java是否需要保留完整的ArrayList,因为我引用了它们。如果这是一个巨大的列表,最好只复制我需要的两个对象,让其余的由GC收集,不是吗?
或者GC是否足够智能自己呢?然后第一种方法会制作不必要的对象副本。在这种情况下没什么大不了的,但在另一种情况下,可能会有数百或数千个这样的对象。
答案 0 :(得分:4)
在这两种情况下,退出ArrayList
方法后都不会引用Move()
。在列表中引用元素并不重要。如果列表本身无法访问,则它有资格进行垃圾回收。
只要两个引用的元素被另一个活动对象引用,它们就会保持活动状态。在第二个示例中,只要您的Move
对象可以访问,就可以访问这两个元素。但是如果列表中有其他元素,并且它们未在列表之外引用,则当列表超出范围时,那些元素将有资格进行垃圾回收
答案 1 :(得分:2)
moveSquares
构造函数结束后,您的列表Move
将无法访问(这是一个合理的假设,尽管它最终取决于splitToSquares
方法究竟是什么)。
除此之外,列表中的一个项目仍可访问的事实与列表本身或任何其他列表项目的可访问性无关。它们都将无法到达,因此具有收藏价值。