使用深拷贝来保证集合复制不被set注入修改参数

项目场景:

因为项目上有一个需求里面我需要复制一个集合的同时,对其中一个集合进行修改,由于我用的set注入的方式进行修改后我发现两个集合里面的参数居然同时发生了改变,这让我大为震惊,经过我一阵操作终于明白了,因为复制完的两个集合其实后台都是指向的同一个对象。


问题描述

由于之前各种复制集合的方法我都试用过了,其中包括构造器,AddAll(),Collections.copy,steam流等等,这些方法复制集合后,修改会同时修改两个List集合,为避免以后再遇到这类情况以此记录。

方法一:

此处可以用类或者VO重写clone方法(写在你想要复制的集合对象),并且实现Serializable,Cloneable接口

   @Data
    public static class TradeCountVO implements Serializable,Cloneable{
        @ApiModelProperty("时间")
        private String timeZones;

        @ApiModelProperty("每个时间段订单数量")
        private Integer num;

        @Override
        public TradeCountVO clone() throws CloneNotSupportedException {
            return (TradeCountVO)super.clone();
        }

    }

直接调用你要克隆对象的clone方法

 List<TradeRankingVO.TradeCountVO> tcVO = new ArrayList<>();
                //必须要使用深拷贝(修改的话两个List指向的同一个对象)
            				tcVO.add(tradeCountVO.clone());

方法二:

调用hutool里面的ObjectUtil.cloneByStream(obj)方法,同样也可以实现深拷贝

前提是对象必须实现Serializable接口。
ObjectUtil同样提供一些静态方法:clone(obj)**、cloneIfPossible(obj)**用于简化克隆调用,详细的说明请查看核心类的相关文档。

原因分析:

其实之前或多或少都用过AddAll之类的复制集合的方法,但是都没发现此类问题,可能还是我不够谨慎,以此记录防止以后再发生类似情况。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值