【问题标题】:Are all java objects held in memory until destroyed somehow?是否所有java对象都保存在内存中,直到以某种方式销毁?
【发布时间】:2014-12-10 19:44:09
【问题描述】:

我有一个使用数据库的 Android 应用程序。我创建的 db 类将迭代数据库并使用单独的类来“HOLD”?每一行。

public List<Poster> getAllPosters() {
    List<Poster> posterList = new ArrayList<Poster>();
    // Select All Query
    String selectQuery = "SELECT * FROM " + "posters";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Poster poster = new Poster(Integer.parseInt(cursor.getString(0)),Integer.parseInt(cursor.getString(1)),Integer.parseInt(cursor.getString(2)),cursor.getString(3),cursor.getString(4),cursor.getString(5),cursor.getString(6),cursor.getString(7),cursor.getString(8));

            // Adding contact to list
            posterList.add(poster);
        } while (cursor.moveToNext());
    }
    db.close(); // Closing database connection
    // return contact list
    return posterList;
}

海报课如您所愿。它有一个构造函数,其中包含与列相关的每个变量以及设置和获取每个列值的方法。

那么现在每一行是它自己的可以随时访问的对象,还是它是作为对象并且包含所有行的海报类?

此外,在应用终止或被新的 Poster 实例覆盖之前,此对象是否在内存中?

【问题讨论】:

  • 您返回Poster 的列表。只要有对它们的引用,就可以使用该列表及其引用。在最后一个引用消失后,它就有资格进行 GC; GC 发生的时间取决于。

标签: java android class object


【解决方案1】:

您创建多个海报对象(海报类的实例)

Poster poster = new Poster( ... );

并将它们存储在posterList(海报对象列表,List&lt;Poster&gt;)中

posterList.add(poster);

然后用

返回列表
return posterList;

您可以使用此列表通过以下方法访问检索到的对象:posterList.get(0)

创建的对象将存储在内存中(堆上),直到被垃圾收集器删除。但是如果你持有对它的引用,垃圾收集器不会删除任何东西。在您的示例中,引用保存在 posterList 中,因此在您清除列表或删除对列表本身的所有引用之前,不会删除任何 Poster 对象。

【讨论】:

    【解决方案2】:

    您正在返回Poster 对象的列表。请记住,对象只不过是类的一个实例。每次调用Poster poster = new Poster( ... ); 时,您都在创建一个新对象。您返回的是您创建的这些对象的列表,这些对象保存在堆上,直到程序结束,或者您覆盖它们。

    【讨论】:

    • which are held on the heap until the program ends, or you overwrite them. 我知道你的意思,但这并不完全准确。当不再有任何对它的引用时,堆上的任何对象都可以进行标记和清除。您不必为此覆盖它们。
    【解决方案3】:
    So is each row now it's own object that can be accessed anytime or is it the Poster Class that is the object and it contains all of the rows?
    

    现在每一行都处于不同的抽象级别,它们现在映射到一个 Java 对象(最有可能是一个普通的旧 Java 对象 [POJO]),而且,“类”只是一个蓝图,它不是一个object 它根本不包含任何东西,它将作为对象可以是什么的定义而存在,您需要深入了解它的基础知识。

    Also, is this object in memory until the app terminates or is overwritten by a new instance of Poster?
    

    是的,您通过用新的引用擦除他的旧引用来覆盖海报对象,但是您在覆盖它之前正确地将海报对象的引用添加到列表中,所以只要您使用列表,所有这些引用不会被垃圾收集

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-17
      • 2021-05-13
      • 2015-02-03
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-10-07
      相关资源
      最近更新 更多