list.add()中的小细节
最近在码代码的时候发现一个有趣的list问题,就是list<基础类型>中的add()方法和list<对象>中的add()方法会有点区别。
前者是和预想的一样,就是给集合按顺序添加元素,而后者在添加的时候会覆盖前面的元素。
例如:
list<基础类型>
public static void main(String[] args){
List<String> list = new ArrayList<String>();
list.add("第一个元素");
list.add("第二个元素");
list.add("第三个元素");
list.add("第四个元素");
//list.remove(1);
//通过foreach方式遍历所有元素
for (String element : list){
System.out.println("foreach遍历:" + element);
}
运行结果
list<自定义对象>
List<Cat> cats = findCatByCatId(catid);
CatInfoDto catInfoDto = new CatInfoDto();
List<Object> catInfoDtos = new ArrayList<>();
for (Cat cat : cats){
catInfoDto.setCatid(cat.getId());
catInfoDto.setCatname(cat.getCatname());
catInfoDtos.add(catInfoDto);
}
每一次遍历,list中的内容都会被新的cat覆盖
查询资料发现,转递给add()方法的是catInfoDto类的引用,是一个内存地址,所以定义在外部for循环外部的对象的引用,在for循环的时候没有改变内存地址,所以添加到list的是同一个对象的地址,所以每次add都会覆盖掉前面的内容。
如果想不覆盖的话,在for循环内部再重新new一个catInfoDto类对象即可,这样每次循环都会重新在内存中开辟一段空间
List<Cat> cats = findCatByCatId(catid);
CatInfoDto catInfoDto = new CatInfoDto();
List<Object> catInfoDtos = new ArrayList<>();
for (Cat cat : cats){
catInfoDto = new CatInfoDto();
catInfoDto.setCatid(cat.getId());
catInfoDto.setCatname(cat.getCatname());
catInfoDtos.add(catInfoDto);
}