【问题标题】:Why/How does returning a "locally instantiated array" work in Java?为什么/如何在 Java 中返回“本地实例化数组”?
【发布时间】:2013-05-16 20:46:57
【问题描述】:

以下代码 sn-p 似乎完全符合我的要求:

public CharSequence[] getAllCities() {
  String selectQuery = "select " + COLUMN_CITY + " from " + TABLE_NAME;

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

  CharSequence[] cities = new CharSequence[cursor.getCount()];

  if (cursor.moveToFirst()) {
    int numColumns = cursor.getColumnCount();
    int i=0;
    do {        
      cities[i++] = cursor.getString(0);
    } while (cursor.moveToNext());
  }

  cursor.close();
  db.close();
  return cities;
}

即调用者得到返回的有效值:

CharSequence[] wowthiswillneverworkincpp = database.getAllCities();

但是...当垃圾收集器启动时,这不是会在某个意想不到的时刻咬我吗?

如果不是,Java 语言中的什么特性可以保证这个本地实例化的数组在整个使用过程中保持有效?我是否正确地假设只要它被分配到某个地方(即“引用”),它就不会被 GC 擦干净?

【问题讨论】:

    标签: java garbage-collection return


    【解决方案1】:

    对象是在本地还是在任何其他地方实例化都没有关系。如果某个东西在本地 (cities) 或从方法的返回中分配 (wowthiswillneverworkincpp) 对它有引用,那么垃圾收集器不会将其清除干净。

    【讨论】:

    • @uTubeFan 另外,Java 不是 C/C++:没有“本地实例化”,每个对象都在堆上用 new 实例化。
    • 我认为编译器有时可能会在堆栈上实例化,如果它肯定对象永远不会在本地方法之外的任何地方使用。这不是这里的情况。
    • @user949300 更重要的是,这是一种优化,因此绝不能影响语义(显然,除了优化器中的错误)。
    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 2010-12-02
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多