java:使用现有对象还是创建一个新对象?

标签 java garbage-collection

什么更好:

这个

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 将不会被引用。您引用列表 的元素并不重要。如果列表本身不可访问,则它有资格进行垃圾回收。

只要两个引用的元素被另一个 Activity 对象引用,它们就会保持 Activity 状态。在您的第二个示例中,至少只要您的 Move 对象可以访问,这两个元素就可以访问。但是如果列表中有 其他 元素,并且它们没有在列表之外被引用,那么当列表超出范围时,那些 元素将有资格进行垃圾回收.

关于java:使用现有对象还是创建一个新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20505532/

相关文章:

java - 从 Eclipse 访问 MySql 时出现错误 "Unknown system variable ' lower_case_table_names'"

java - Ant Ivy : heap out of memory: GC overhead limit exceeded

asp-classic - VBScript 似乎是以错误的顺序从嵌套作用域中 GC 的对象

haskell - 从 C 调用 Haskell 导出时,垃圾收集器何时运行?

java - 在 Java 中使用弱引用的成本

Java:与垃圾收集器赛跑

java - Maven 无法下载依赖项

java - 使用 Play Framework 调试命令时出错

java - 事务未激活异常 - EJB 事务状态

java - 为什么java方法不支持多个返回值?