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);

        }

运行结果

java list add方法 java中list.add_List

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);
        }