由下面一段代码引发的思考:
// 注:提取出list中的人员 3个一组if (baList != null && baList.size() > 0) { EntMajorPerson emp = new EntMajorPerson(); ☆ for (int i = 0; i < (baList.size() / 3);) { // EntMajorPerson emp = new EntMajorPerson(); Integer num = Integer.valueOf(baList.get(i)); emp.setSerialNumber(num); emp.setFullName(baList.get(i + 1)); emp.setPost(baList.get(i + 2)); emp.setRegisterLinkId(registerLinkId); emp.setCreateTime(getCreateTime()); entMajorPersons.add(emp); i += 3; } if (entMajorPersons.size() != 0) { DataManager.addDatas(DataManager.EntMajorPersonMapper_Key, entMajorPersons); }}
上文中打重点符号的这句话如果在for循环的外部试想会有什么后果?
直接现象就是,每回存储用的都是一个对象,后一个对象的属性如果为空值,那么前一个的属性就覆盖过来了,会发生错误。 解决办法就是将创建对象这句话放到循环里面,每次都创建一个新的对象。 但细想一步,每次都创建一个对象,会不会降低效率,消耗更多内存呢?☆答案是否定的
引用之前的TIJ中的内存分析的一段:2. 栈(又名堆栈),原型就是碟盘子模型,先放的盘子后拿。栈位于通用RAM(随机访问存储器)中,但通过堆栈指针可以直接从处理器那里获得直接支持。通过栈顶指针的上下移动来创建和释放内存,这是一种快速有效的分配存储的方法,仅次于寄存器。但是这种方式,java系统必须知道存储在堆栈内所有项的生命周期,以便上下移动堆栈指针。所以对象的引用存在与堆栈中(因为有确切的生命周期),但是对象不会存于堆栈中(无确切的生命周期)。
3.堆。一种通用的内存池,也是位于RAM区,用于存放所有的java对象。堆不同与堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储由很大的灵活性。当需要一个对象时,只需new一个,当执行时,会自动在堆里进行分配内存。当然,为了这种灵活性必须付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。(对比于C++,对象会在栈中存储,因为对象的生命周期都是程序员自己控制的)引用是存在栈中的,因为有确切的生命周期,栈指针的移动是非常快的,到生命周期结束内存就释放了。
所以回到上面的话题,这句话在循环内部是可以的。