java中list.add()方法中的小細節


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM