项目场景:
因为项目上有一个需求里面我需要复制一个集合的同时,对其中一个集合进行修改,由于我用的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之类的复制集合的方法,但是都没发现此类问题,可能还是我不够谨慎,以此记录防止以后再发生类似情况。