问题:
1.首先我们有一个User表
package com.itheima.test;
@Data
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
2.测试
@Test
public void test3() {
List<User> list = new ArrayList<>();
User user = new User();
for (int i = 1; i <= 5; i++) {
user.setAge(i);
list.add(user);
}
for (User u : list) {
System.out.println(u);
}
}
3.结果
原因:
当我们new User()时相当于在堆内存开辟一块内存空间,这个内存空的地址假设为X001。而List集合存储对象时保存的引用,该引用指向对应的地址。
这时候我们使用add方法时,会增加值的个数,但引用地址不变,所以再次改变对象的值会影响到之前添加到集合中对象的值,造成覆盖。
解决:
可以将new User()放在循环内:
@Test
public void test3() {
List<User> list = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
User user = new User();
user.setAge(i);
list.add(user);
}
for (User u : list) {
System.out.println(u);
}
}
结果:
覆盖问题二:
给User表中的属性加上static即使将new User()放在循环内,也同样会造成同样的覆盖问题
原因:
被static关键字修饰的成员变量将会变为所有对象共享