[英]java: use existing object or create a new one?
什么是更好的:
這個
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足夠智能,可以自己做? 然后,第一種方法將制作不必要的對象副本。 在這種情況下,沒什么大不了的,但是在另一情況下,可能有成百上千個這樣的對象。
在這兩種情況下,一旦退出Move()
方法,都不會引用ArrayList
。 不要緊,您引用列表中的元素。 如果列表本身不可訪問,則可以進行垃圾回收。
只要兩個引用的元素被另一個活動對象引用,它們將保持活動狀態。 在第二個示例中,只要您的Move
對象是可到達的,那么這兩個元素將是可到達的。 但是,如果列表中還有其他元素,並且沒有在列表之外引用它們,那么當列表超出范圍時, 這些元素將有資格進行垃圾回收。
一旦Move
構造函數結束,您的列表moveSquares
就變得不可訪問(這是一個合理的假設,盡管它最終取決於splitToSquares
方法的確切作用)。
除此之外,列表中的一項仍可訪問的事實與列表本身或任何其他列表項的可訪問性無關。 它們都將變得無法到達,因此可以被收集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.