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
相关推荐
Lovyk17 分钟前
Linux 正则表达式
linux·运维
Fireworkitte1 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9002 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char2 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘123 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
有梦想的攻城狮6 小时前
Java 11中的Collections类详解
java·windows·python·java11·collections
忒可君6 小时前
C# winform FTP功能
开发语言·windows·c#
华强笔记7 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发7 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建
degree5207 小时前
全平台轻量浏览器推荐|支持Win/macOS/Linux,极速加载+隐私保护+扩展插件,告别广告与数据追踪!
windows·macos·电脑