工作记录------List循环插入对象,属性覆盖问题记录
背景:list数组中,想插入同一个类,只是属性值不同,循环插入后。
发现:后插入属性值覆盖了最开始插入的属性值。
错误示例代码:
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student student = new Student();
for (int i = 0; i < 5; i++) {
student.setId(i);
list.add(student);
}
//5
System.out.println(list.size());
//理论值为0
System.out.println(list.get(0).getId());
}
}
List长度为5,输出理论预想值为0,结果实际输出为4。
原因:后插入的属性值覆盖了之前插入的属性值。
原因:
如果是引类型时,在循环外边已经new了一个对象,相当于这个对象的地址在内存空间已经开辟出来了,保存到了固定的位置,这时候我们使用add方法时,会增加值的个数,但引用地址不变,所以后面的值会覆盖掉前面的值 。
如果是值对象时,这种和上面就不一样了,值对象用来保存一组不会改变的量,当我们需要使用这个对象时,会在系统中开辟另一个空间。因此,值对象使用add方法时不会出现覆盖问题。
改变:其实也很好改每次new新对象,开辟新的内存空间即可。
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Student student = new Student();
student.setId(i);
list.add(student);
}
//5
System.out.println(list.size());
//0
System.out.println(list.get(0).getId());
}