局部变量-循环内定义变量,和循环外定义变量的问题

问题描述

循环内定义变量,和循环外定义变量的问题

循环外定义变量 tempReportInfo

public 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

局部变量-循环内定义变量,和循环外定义变量的问题的相关文章

android-循环内设置标志判断 循环却终止了 求解

问题描述 循环内设置标志判断 循环却终止了 求解 在搞一个局域网式物联网 上位机与下位机之间的通讯 想用一个按钮去停止另一个按钮的命令循环 看下面代码 protected static boolean bloopflag = false;//设置的全局变量 public void juhuiCmdButton(View view) {//一个按钮事件 new Thread(new Runnable() { @Override public void run() { for (int i=0;i<

js for循环,为什么一定要加var定义i变量_javascript技巧

譬如下面. 复制代码 代码如下: for(i=0;i<10;i++){//就不写成: var i=0 alert(i); } 但是,这真的不是个好习惯,下面我就说说为什么写Js的for循环一定要加var,否则会时不时给你带来烦人难查的bug. 譬如现在我们要实现这样的功能:输出 10 20 30 40 50 60 70 80 90 100 通过下面code实现,WriteNumber从1到10循环,每次循环调用TenTimes方法返回10倍的索引值. 复制代码 代码如下: <script ty

c++-C++内层循环中定义变量和在外面定义比影响大吗

问题描述 C++内层循环中定义变量和在外面定义比影响大吗 例如: for(int i=0;i<999;i++){ for(int j=0;j<999;j++); } 内层循环每次都定义j会造成多大的消耗呢 解决方案 这个需要看你具体用什么编译器.不过主流编译器(如vs和gcc)这一块优化都比较好,不会反复分配变量. 解决方案二: 以前我也有过这种担心,不过现在看完别人的评论,我有点豁然开朗了,在内层循环中定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化. 解决方案三: 这种基本可以忽

C++类的成员函数(在类外定义成员函数、inline成员函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

java中类定义的变量和类方法里面定义的变量有什么区别和联系

问题描述 java中类定义的变量和类方法里面定义的变量有什么区别和联系 java中类定义的变量和类方法里面定义的变量有什么区别和联系为什么要再方法当中定义变量,统一在类里面,方法外面定义变量不是更方便快捷么 解决方案 Java中的作用域非常容易理解就看大括号.一个变量的作用域始终是从定义的位置开始直到当前大括号结束.在这个范围之内就可以不使用任何前缀直接访问它.不在这个范围内那就必须得""想办法""访问它. 解决方案二: 类种定义的变量是类的成员变量,在所有的类方法

C++编程中变量的声明和定义以及预处理命令解析_C 语言

关于C++变量的声明和定义 我们已经知道,一个函数一般由两部分组成:声明部分和执行语句. 声明部分的作用是对有关的标识符(如变量?函数?结构体?共用体等)的属性进行说明.对于函数,声明和定义的区别是明显的,前边已说明,函数的声明是函数的原型,而函数的定义是函数功能的确立.对函数的声明是可以放在声明部分中的,而函数的定义显然不在函数的声明部分范围内,它是一个文件中的独立模块. 对变量而言,声明与定义的关系稍微复杂一些.在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如int a;):另一

PHP 7: PHP 变量和常量的定义

原文:PHP 7: PHP 变量和常量的定义本章说说变量的定义.如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到: 如何定义变量,它和C# 等语言有什么不同呢? 变量区分大小写吗? PHP的变量还有其他重要的吗? 常量和变量的定义一样吗?  分别讲述吧.1.如何定义变量,它和C# 等语言有什么不同呢?   PHP 中的变量用一个美元符号后面跟变量名来表示.变量名是区分大小写的.例如: <?php  $var='Jim';  $VAR='Kimi;  echo "$var,$VAR

c语言-C语言循环链表的头节点是定义成变量好,还是定义成结构体好?

问题描述 C语言循环链表的头节点是定义成变量好,还是定义成结构体好? C语言循环链表的头节点是定义成变量好,还是定义成结构体好? 解决方案 这不过是两个不同的方式而已,并没有什么本质上的不同. 解决方案二: 定义成什么,要看你节点中要保存的数据是什么.一般来说,是需要一个结构体的.因为除了一个有效数据外,你还需要链表的指针. 解决方案三: 都可以,不过建议定义为结构体,应为可以和后面的节点做同样的操作. 解决方案四: 个人推荐使用结构体,作为头结点,其存储的信息较多.单向链表为例,他有可能要存储

PHP变量详解和定义变量名的方法

1.定义常量define("CONSTANT", "Hello world."); 常量只能包含标量数据(boolean,integer,float 和 string). 调用常量时,只需要简单的用名称取得常量的值,而不能加"$"符号,如:echo CONSTANT: 注: 常量和(全局)变量在不同的名字空间中.这意味着例如 TRUE 和 $TRUE 是不同的. 2.普通变量$a = "hello"; 3.可变变量(使用两个美