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