Java 6种常见拷贝集合方式深浅拷贝测试

文章目录

Java 6种常见拷贝集合方式深浅拷贝测试

测试时共用方法

java 复制代码
	/**
     * 生成集合数据
     *
     * @return
     */
    static List<CouponVo> getList() {
        List<CouponVo> list = new ArrayList<>();
        CouponVo couponVo = new CouponVo();
        couponVo.setActivityId("1");
        List<DiscountsUseRuleVOList> discountsUseRuleVOLists = new ArrayList<>();
        DiscountsUseRuleVOList discountsUseRuleVOList = new DiscountsUseRuleVOList();
        discountsUseRuleVOList.setRuleName("1");
        discountsUseRuleVOLists.add(discountsUseRuleVOList);
        couponVo.setDiscountsUseRuleVOList(discountsUseRuleVOLists);
        list.add(couponVo);
        return list;
    }
java 复制代码
    /**
     * 修改值
     *
     * @param sourceList
     */
    static void changeValue(List<CouponVo> sourceList) {
        // 修改原集合数据
        // 修改第一层属性值
        sourceList.get(0).setActivityId("2");
        // 修改嵌套对象的值
        sourceList.get(0).getDiscountsUseRuleVOList().get(0).setRuleName("2");
    }
java 复制代码
    /**
     * 检查复制的结果是否是深浅拷贝
     *
     * @param copiedList
     */
    static void checkCopy(List<CouponVo> copiedList) {
        boolean firstLayerDeepCopy = copiedList.get(0).getActivityId().equals("1");
        boolean secondLayerDeepCopy = copiedList.get(0).getDiscountsUseRuleVOList().get(0).getRuleName().equals("1");
        System.out.println("第一层是否深拷贝:" + firstLayerDeepCopy);
        System.out.println("第二层是否深拷贝:" + secondLayerDeepCopy);
    }

ArrayList构造方法(浅拷贝)

测试代码

java 复制代码
    /**
     * new ArrayList<>(list);
     */
    @Test
    public void test1() {
        System.out.println("new ArrayList<>(list); 拷贝");
        List<CouponVo> list = getList();
        List<CouponVo> couponVos = new ArrayList<>(list);
        // 修改原集合数据
        changeValue(list);
        checkCopy(couponVos);
    }

运行结果

txt 复制代码
new ArrayList<>(list); 拷贝
第一层是否深拷贝:false
第二层是否深拷贝:false

list.addAll()方法(浅拷贝)

测试代码

java 复制代码
    /**
     * list.addAll();
     */
    @Test
    public void test6() {
        System.out.println("list.addAll(); 拷贝");
        List<CouponVo> list = getList();
        List<CouponVo> couponVos = new ArrayList<>();
        couponVos.addAll(list);
        // 修改原集合数据
        changeValue(list);
        checkCopy(couponVos);
    }

运行结果

txt 复制代码
list.addAll(); 拷贝
第一层是否深拷贝:false
第二层是否深拷贝:false

list.stream().collect(Collectors.toList()); (浅拷贝)

测试代码

java 复制代码
    /**
     * list.stream().collect(Collectors.toList());
     */
    @Test
    public void test2() {
        System.out.println("list.stream().collect(Collectors.toList()); 拷贝");
        List<CouponVo> list = getList();
        List<CouponVo> couponVos = list.stream().collect(Collectors.toList());
        // 修改原集合数据
        changeValue(list);
        checkCopy(couponVos);
    }

运行结果

txt 复制代码
list.stream().collect(Collectors.toList()); 拷贝
第一层是否深拷贝:false
第二层是否深拷贝:false

spring BeanUtils.copyProperties()方法 (第一层深拷贝,嵌套对象浅拷贝)

测试代码

java 复制代码
    /**
     * list.stream().map(o -> {
     * CouponVo couponVo = new CouponVo();
     * BeanUtils.copyProperties(o, couponVo);
     * return couponVo;
     * }).collect(Collectors.toList()); 拷贝
     */
    @Test
    public void test3() {
        System.out.println("list.stream().map(o -> {\n" +
                "            CouponVo couponVo = new CouponVo();\n" +
                "            BeanUtils.copyProperties(o, couponVo);\n" +
                "            return couponVo;\n" +
                "        }).collect(Collectors.toList()); 拷贝");
        List<CouponVo> list = getList();
        List<CouponVo> couponVos = list.stream().map(o -> {
            CouponVo couponVo = new CouponVo();
            BeanUtils.copyProperties(o, couponVo);
            return couponVo;
        }).collect(Collectors.toList());
        // 修改原集合数据
        changeValue(list);
        checkCopy(couponVos);
    }

运行结果

txt 复制代码
list.stream().map(o -> {
            CouponVo couponVo = new CouponVo();
            BeanUtils.copyProperties(o, couponVo);
            return couponVo;
        }).collect(Collectors.toList()); 拷贝
第一层是否深拷贝:true
第二层是否深拷贝:false

Hutool工具BeanUtil.copyToList方法(第一层深拷贝,嵌套对象浅拷贝)

测试代码

java 复制代码
    /**
     * BeanUtil.copyToList(list, CouponVo.class) 拷贝
     */
    @Test
    public void test4() {
        System.out.println("BeanUtil.copyToList(list, CouponVo.class) 拷贝");
        List<CouponVo> list = getList();
        List<CouponVo> couponVos = BeanUtil.copyToList(list, CouponVo.class);
        // 修改原集合数据
        changeValue(list);
        checkCopy(couponVos);
    }

运行结果

txt 复制代码
BeanUtil.copyToList(list, CouponVo.class) 拷贝
第一层是否深拷贝:true
第二层是否深拷贝:false

fastjson 序列化反序列化方法(深拷贝)

测试代码

java 复制代码
   /**
     * JSONObject.parseArray(JSONObject.toJSONString(list), CouponVo.class); 深拷贝
     */
    @Test
    public void test5() {
        System.out.println("JSONObject.parseArray(JSONObject.toJSONString(list), CouponVo.class); 拷贝");
        List<CouponVo> list = getList();
        List<CouponVo> couponVos = JSONObject.parseArray(JSONObject.toJSONString(list), CouponVo.class);
        changeValue(list);
        checkCopy(couponVos);
    }

运行结果

txt 复制代码
JSONObject.parseArray(JSONObject.toJSONString(list), CouponVo.class); 拷贝
第一层是否深拷贝:true
第二层是否深拷贝:true
相关推荐
凡人叶枫6 分钟前
Effective C++ 条款24:若所有参数皆须要类型转换,请为此采用 non-member 函数
linux·前端·c++·算法·嵌入式开发
caimouse9 分钟前
Reactos 第 5 章 进程与线程 — 5.13 Windows的跨进程操作
windows
零陵上将军_xdr9 分钟前
Shell流程控制:if/case/for/while让脚本活起来
linux·运维·服务器
坤昱16 分钟前
cfs调度类深入解刨——pelt细节篇
linux·linux内核·cfs调度·eevdf·cfs调度类深入解刨·pelt·pelt细节篇
故渊at32 分钟前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
shen121381 小时前
【cdp】windows持久化运行cdp浏览器
windows·agent·cdp
某林2121 小时前
ROS2 并行编译死锁与 Linux 后台声卡/提权踩坑实录:大型轮足机器人架构复盘
linux·架构·机器人·iassc
无足鸟ICT1 小时前
【RHCA+】末行模式
linux
W优化大师1 小时前
Windows电脑频繁弹广告怎么彻底清除?从定位来源到卸载残留的完整方法
windows·电脑
拼搏的小浣熊1 小时前
【通用教程】Windows\+Linux\+银河麒麟系统 固定静态IP地址|解决打印机扫描IP变动、网络掉线问题
linux·网络·windows·麒麟·固定ip·麒麟系统·统信系统