浅析Java中for循环里对list进行add操作踩坑
一、结论
先说结论:使用 for 循环循环一个list,并在for循环中将某对象或者用于承载数据的list 添加add进另外一个list时,该对象或用于承载数据的 list 必须要在for循环内创建。若在for循环外创建,则 add 进的数据都会变成最后一次循环添加的数据。
List<ManHourSummaryVo> mhSummaryVoList = manHourSummaryMapper.selectHoursByNo(EmployeeNoMap);
calculateAnnualLeave(mhSummaryVoList);
if(mhSummaryVoList.size()>0){
for(int i = 0;i < mhSummaryVoList.size(); i++){
ManHourSummaryVo mhSummaryVo = mhSummaryVoList.get(i);
List<String> contentList = new LinkedList<String>();
if(null != mhSummaryVo){
contentList.add(nullToStr(mhSummaryVo.getName()));
contentList.add(null == mhSummaryVo.getEmployeeNo() ? "" : mhSummaryVo.getEmployeeNo().toString());
......
}
// 存入工作表内容
titleAndContList.add(contentList);
}
}
其中 List<String> contentList = new LinkedList<String>(); 必须在 for 循环内部创建,如果是在 for 循环外部创建,则 add 进的数据都会是最后一次循环添加的数据。
以上代码遍历 mhSummaryVoList,然后创建 contentList 用于承载 mhSummaryVoList 里元素的数据,然后再把 contentList 添加到 titleAndContList。因此 contentList 必须在 for 循环内部被创建。
使用for循环给list赋值,结果发现得到的list中的元素值全都变成了最后一个元素的值,经过查资料才知道 list 在add时,每次保留一个它的引用,所以在for循环外面new list 的元素,最后得到的list里面全都成了最后一次的值。因此每循环一次,就要new 一次list中的元素对象。
二、问题解析
1、问题现象:分别在 for 循环内外new一个对象,然后在循环中将对象加入集合中,两种方法产生的结果不同。
(1)在for循环内new一个对象,并添加进list中,与添加数值的结果没有差别。
(2)在for循环外new一个对象,并添加进list中,无论循环多少次,最终整个list中的结果都会是最后一次赋值为对象的结果。
2、原因:
在创建List时,指定了引用对象House作用泛型,list.add()在添加对象时,添加的是它的引用,而在循环体外new一个对象,在循环体内赋值,则对象House引用不变,数值改变,因引用不变,最终赋值结果指向引用,list 集合中都是最后一次赋值的结果。
相关文章
- Java 并发工具包 java.util.concurrent 用户指南
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
- java安装1.8和1.7,报错:Error: Registry key 'SoftwareJavaSoftJava Runtime Environment'CurrentVers
- Java 基于UDP的类似于QQ的循环通信
- Java核心技术卷I基础知识3.8.4 确定循环
- Java核心技术卷I基础知识3.10.1 for each循环
- Java核心技术卷I基础知识3.10.4 命令行参数
- Java核心技术卷I基础知识3.10.5 数组排序
- JAVA单元测试框架-12-java代码重复执行失败的测试用例
- java线上排查OOM内存溢出
- 【Java】java: 无法访问org.testng.annotations.Test
- 第二节:Java入门第一行代码
- Java 循环结构,超详细整理,适合新手入门
- 【HarmonyOS】【JAVA UI】鸿蒙 自定义折线图
- Java Design Demo -简单的队列-异步多任务队列(java android)
- JAVA好书之《深入理解Java虚拟机》
- java sleep()和wait()的区别
- Error running 'dt-assets-monitor [clean]': Cannot run program "C:Program Files (x86)Javajdk1.8.0_73binjava.exe" (in directory "E:codedt-assets-monitor")
- Java线程锁,synchronized、wait、notify详解--java 管程
- Java目录
- 深入浅出Rhino:Java与JS互操作
- 蓝桥杯VIP试题 之 基础练习 芯片测试 - JAVA
- [zt]java synchronized详解
- Java小白入门200例61之java中Date日期类型的大小比较
- 什么是Java序列化,如何实现java序列化
- 【JAVA】浅谈java枚举类
- java hashmap的底层
- java项目异常监控_JAVA项目中的常用的异常处理情况总结
- java最常用的几种加密算法