List循环添加数据覆盖问题
问题:java开发时,当我们使用List.add();循环添加数据,有时会出现前面添加的数据会被后面覆盖的现象。这是怎么回事尼?
会覆盖数据的代码
package com.boot.test; import lombok.Data;
import java.util.ArrayList;
import java.util.List; @Data
public class StudentVo {
private String name;
private String age; public static void main(String [] args){
List<Student> students = new ArrayList<Student>();
students.add(new Student("a","1"));
students.add(new Student("b","2")); for(int i=0;i<students.size();i++){
System.out.println(students.get(i));
}
System.out.println("--------------------------------"); List<StudentVo> studentLists = new ArrayList<StudentVo>();
/**下面是重点 对象在这里创建时会覆盖数据*/
StudentVo studentVo = new StudentVo();
for(int j=0;j<students.size();j++){
studentVo.setName(students.get(j).getName());
studentVo.setAge(students.get(j).getAge());
studentLists.add(studentVo);
}
/**打印结果*/
for(int k=0;k<studentLists.size();k++){
System.out.println(studentLists.get(k));
}
}
} console:

不会覆盖数据的代码
package com.boot.test; import lombok.Data;
import java.util.ArrayList;
import java.util.List; @Data
public class StudentVo {
private String name;
private String age; public static void main(String [] args){
List<Student> students = new ArrayList<Student>();
students.add(new Student("a","1"));
students.add(new Student("b","2")); for(int i=0;i<students.size();i++){
System.out.println(students.get(i));
}
System.out.println("--------------------------------");
List<StudentVo> studentLists = new ArrayList<StudentVo>(); for(int j=0;j<students.size();j++){
/**此时对象在这里创建 不会覆盖数据*/
StudentVo studentVo = new StudentVo();
studentVo.setName(students.get(j).getName());
studentVo.setAge(students.get(j).getAge());
studentLists.add(studentVo);
}
/**打印结果*/
for(int k=0;k<studentLists.size();k++){
System.out.println(studentLists.get(k));
}
}
}
console:

总结:会出现这两种不同结果的原因是 对象创建位置的不同导致。 程序一 整个执行过程中只创建了一个对象,所以数据会被后面的覆盖。程序二 执行过程中创建了多个对象,数据互不干扰,所以数据不会被覆盖。
所以创建实体类对象的位置是导致该问题的根本原因(要在for()内) 给我点赞鸭!
List循环添加数据覆盖问题的更多相关文章
- Android及java中list循环添加时覆盖的问题-20171021
鉴于新浪博客太渣,转到这来. 最近在工程设计时,使用list循环添加map对象发现,最终全部变为最后一个map的值,但是list的数值还是正确的,也就是说添加了N(list长度或者说循环的次数)个相同 ...
- Oracle For 循环添加数据
自己亲自使用的,绝对OK --添加数据declare i number; --用for实现 begin for i in 0 .. 500 loop insert into cust(custsn,t ...
- MySQL存储过程循环添加数据
经常需要测试数据,写个存储过程方便日后使用. DROP PROCEDURE IF EXISTS add_member; DELIMITER $$ CREATE PROCEDURE add_member ...
- SQL语句の循环添加数据
declare @i intset @i=1while @i<=1000begininsert into News_ITM(title,msg,subDateTime,author,imageP ...
- Mysql数据库中 ,涉及事物,循环添加数据
),), ) BEGIN declare cnt ; declare i ; declare growthid ; DECLARE t_error INTEGER DEFAULT ; DECLA ...
- MVC3循环添加数据
foreach (var item in orderdetails) { var billdetails = new BillDetail(){BillCode = billoflading.Bill ...
- 多线程操作(循环往listbox中添加数据)
一.先造一个窗体,其中就开始按钮,暂停按钮,以及listbox文本框 二.当点击开始的时候,数据会无限的往listbox中加,为了防止卡住和提升效率,便造了一个新的线程来执行开始操作 namespac ...
- 点滴笔记(一):for循环ajax请求添加数据
项目里遇到循环添加数据,添加多条数据到主表后,还要根据每条主表数据主键ID添加到子表里,于是想到post提交 发现循环post没效果,也没async参数.. 于是用ajax里面有async设置了fal ...
- 一个selenium简单案例自动添加数据
//本来想着用execl来录入数据的,但是为了尽快完成所以直接搞了个数组 package aldtest; import org.openqa.selenium.*; import org.openq ...
随机推荐
- Promise解决回调地狱(多层调用问题)
Promise # Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息:从本意上讲,它是承诺,承诺它过一段时间会给你一个结果.promise有三 ...
- linux/centos之配置tomcat
一:下载tomcat压缩包 在http://archive.apache.org/dist/tomcat/中下载合适版本的tomcat,也可以在官网上下载,只是一般只有最新版本,选择二进制的后缀为ta ...
- 修改Linux的默认编码
Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK.方法如下: 方法1: vi ...
- Python 基础之面向对象之类中的方法和与类相关的魔术属性以及反射
一.类中的方法 普通方法: 没有参数,只能类调用绑定方法: (1)绑定到对象(自动传递对象参数) (2)绑定到类(自动传递参数)静态方法: 无论是类还是对象,都能调用的方法#例:class Dog() ...
- 【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ
题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...
- Python学习笔记005
if if == : xxxx elif : xxxx else: xxxx 输入字符串 input() 字符串转数值 int() 数值转字符串 str() 输出 print() ...
- Thymeleaf的内置属性(转)
原文链接: http://somefuture.iteye.com/blog/2253761 Thymeleaf是另一个Java视图模板引擎,使用上和FreeMarker各有千秋,不了解的可以从其他博 ...
- SICP题解
这里用Common Lisp.Haskell等函数式语言. 1.2.请将下面表达式变换为前缀形式: $$ \frac{5 + 4 + (2 - (3 - (6 + \frac{4}{5})))}{3( ...
- error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation
遇到这个问题,请打开项目的Properties(属性)------->Configuration Properties(配置属性)------>C/C++ ------>Prepro ...
- jforum发表文章和回复文章显示中文乱码问题
jforum安装时,在数据库创建jforum数据库的时候,设置了字符集(CREATE DATABASE jforum DEFAULT CHARACTER SET utf8 COLLATE utf8_g ...