栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java循环中List添加元素把前面的元素被覆盖问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java循环中List添加元素把前面的元素被覆盖问题

在一次写代码中发现返回的集合都是都是一样的数据,看了后台代码才发现list添加那里有问题,不多说,上代码:

错误代码示例

		List> list = new ArrayList<>();
		Map map = new HashMap<>();//我把map新建在了循环外
        String value  = "";
        //遍历获取汽车类型集合的key
        for(String key:PlatformUtil.getCodeMap("CarTypeCode").keySet()){
            //获取value
            value = PlatformUtil.getCodeMap("CarTypeCode").get(key).toString();
            map.put("value",key);
            map.put("label",value);
            list.add(map);
            System.out.println(list);
        }
        return list;

输出可以看到, 每一次循环我list前面的内容都被覆盖了
为了节约java内存,我把map直接在循环外new好,防止他每次循环都要new一次而导致浪费空间,后来发现错了!!

原因:
因为ArrayList集合里存放的是一个对象的引用。如果我把map对象new在循环外, 那么每次我改变map的时候只改变了他的内容, 而引用并没有发生改变,所以在改变map对象时,list之前添加的也会一起改变。所以我们应该把map new在循环的里面, 每次创建都有一个新的引用

正确代码示例:

		List> list = new ArrayList<>();
        String value  = "";
        //遍历获取汽车类型集合的key
        for(String key:PlatformUtil.getCodeMap("CarTypeCode").keySet()){
            //要在循环内创建对象不然list添加会覆盖之前的内容
            Map map = new HashMap<>();
            //获取value
            value = PlatformUtil.getCodeMap("CarTypeCode").get(key).toString();
            map.put("value",key);
            map.put("label",value);
            list.add(map);
            System.out.println(list);
        }
        return list;

输出可以看到list之前都对象都没有被覆盖了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号