今天做到从数据库中取出数据然后存入实体类的对象,然后将对象放到list集合中,后来发现取出来的数据全是一样的
这个是我的程序代码:
public List<IdAndName> getAllIdandName(String sql) throws Exception{
Course course=new Course();
List<Course> list=new ArrayList<Course>();
list=getList(sql);
IdAndName idName=new IdAndName();
List<IdAndName> ls=new ArrayList<>();
for(int i=0;i<list.size();i++)
{
idName.setId(list.get(i).getId());
idName.setName(list.get(i).getCourseName());
System.out.println(idName.toString());
ls.add(idName);
}
return ls;
}
在什么面的代码中我希望是返回一个list,里面存着的对象是不同的,但是发现list中的对象全部都是相同的,问题在循环里面,循环中每一次我都是更新对象idName的id和name属性,以为这样存进去的就是不同的对象,但是我没有想到的是list存对象的时候,是存入的对象的在堆中的内存地址,虽然我每次都更新这个idName对象的属性值,但是存到最后,还是只存进了一个对象。
在输出结果中我们可以看到:
com.entity.IdAndName@25a56154
com.entity.IdAndName@25a56154
com.entity.IdAndName@25a56154
com.entity.IdAndName@25a56154
在堆中是一样的,那么我们怎样来解决这样的问题,获取到不同的对象,这个就是需要我们每次存入的不是同一个对象,我们将new放入循环的内部就可以解决了
如下:
public List<IdAndName> getAllIdandName(String sql) throws Exception{
Course course=new Course();
List<Course> list=new ArrayList<Course>();
list=getList(sql);
List<IdAndName> ls=new ArrayList<>();
for(int i=0;i<list.size();i++)
{
IdAndName idName=new IdAndName();
idName.setId(list.get(i).getId());
idName.setName(list.get(i).getCourseName());
System.out.println(idName.toString());
ls.add(idName);
}
return ls;
}
最后输出结果:
com.entity.IdAndName@124b943a
com.entity.IdAndName@1141b3a1
com.entity.IdAndName@2eb14c88
com.entity.IdAndName@476b9ef1
这样ls每次存入的就是不同的对象,取出来的时候自然也不同,这个很基础,但是平时也容易忽略,想知道更多可以去百度找引用的数据类型的存储问题。
希望对你有所帮助。