问题描述
- 循环内定义变量,和循环外定义变量的问题
-
循环外定义变量 tempReportInfopublic ArrayList<ReportInfo> getAllReportInfos() { ArrayList<ReportInfo> reportInfos = new ArrayList<ReportInfo>(); Cursor cursor = null; ReportInfo tempReportInfo = new ReportInfo(); synchronized (helper) { if (!db.isOpen()) { db = helper.getWritableDatabase(); } cursor = db.rawQuery("SELECT * FROM " + DBKeysName.TABLE_REPORT, null); try { if (cursor != null) { while (cursor.moveToNext()) { tempReportInfo.setUserIds(cursor.getString(cursor .getColumnIndex(DBKeysName.ROW_REPORT_USERID))); tempReportInfo .setStationName(cursor.getString(cursor .getColumnIndex(DBKeysName.ROW_REPORT_STATIONNAME))); tempReportInfo.setTime(cursor.getString(cursor .getColumnIndex(DBKeysName.ROW_REPORT_TIME))); tempReportInfo.setLineId(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_LINEID))); tempReportInfo.setType(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_TYPE))); tempReportInfo.setRole(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_ROLE))); tempReportInfo.setFlag(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_FLAG))); reportInfos.add(tempReportInfo); } } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { cursor.close(); } } return reportInfos; }
上述例子得到的结果是,reportInfos添加的是数量为与数据表里行数一样的,但内容为数据表里第一条数据.
循环内定义变量tempReportInfo
public ArrayList<ReportInfo> getAllReportInfos() { ArrayList<ReportInfo> reportInfos = new ArrayList<ReportInfo>(); Cursor cursor = null; synchronized (helper) { if (!db.isOpen()) { db = helper.getWritableDatabase(); } cursor = db.rawQuery("SELECT * FROM " + DBKeysName.TABLE_REPORT, null); try { if (cursor != null) { while (cursor.moveToNext()) { ReportInfo tempReportInfo = new ReportInfo(); tempReportInfo.setUserIds(cursor.getString(cursor .getColumnIndex(DBKeysName.ROW_REPORT_USERID))); tempReportInfo .setStationName(cursor.getString(cursor .getColumnIndex(DBKeysName.ROW_REPORT_STATIONNAME))); tempReportInfo.setTime(cursor.getString(cursor .getColumnIndex(DBKeysName.ROW_REPORT_TIME))); tempReportInfo.setLineId(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_LINEID))); tempReportInfo.setType(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_TYPE))); tempReportInfo.setRole(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_ROLE))); tempReportInfo.setFlag(cursor.getInt(cursor .getColumnIndex(DBKeysName.ROW_REPORT_FLAG))); reportInfos.add(tempReportInfo); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { cursor.close(); } } return reportInfos; }
这样才能得到想要的结果:reportInfos添加了数据表里的所有数据.
请问一下,为什么循环外定义变量tempReportInfo就得到不一样的结果呢?
解决方案
放外面也行
但是需要每次循环都加上
tempReportInfo = new ReportInfo();
否则只创建了一个对象,你修改来修改去,添加到集合的都是指向同一个对象的引用
解决方案二:
放外面是每次循环都使用的那一个对象,放循环里面是每次循环都创建一个对象。你也可以在循环外面申请一个引用,然后在循环里面每次在new出来。
解决方案三:
循环外定义会在堆里创建一个对象,然后再循环里的操作都反映在了这个对象上;循环里定义,每执行一次创建一个对象,然后操作的就是这个对象;
解决方案四:
变量定义在循环体内还是循环外?
关于For循环中定义的变量在循环外的引用
关于For循环中定义的变量在循环外的引用
时间: 2024-11-02 22:32:45