• 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);
            }
    
  • 相关阅读:
    CobaltStrike上线Linux主机(CrossC2)
    Active-Directory活动目录备忘录
    CVE-2020-5902 F5 BIG-IP 远程代码执行漏洞复现
    SSTI-服务端模板注入漏洞
    powershell代码混淆绕过
    绕过PowerShell执行策略方法
    "dpkg: 处理归档 /var/cache/apt/archives/libjs-jquery_3.5.1+dfsg-4_all.deb (--unpack)时出错"的解决方法
    firda安装和使用
    内网渗透-跨域攻击
    Web-Security-Learning
  • 原文地址:https://www.cnblogs.com/zzzqi/p/13090865.html
Copyright © 2020-2023  润新知