Java 6种常见拷贝集合方式深浅拷贝测试
文章目录
Java 6种常见拷贝集合方式深浅拷贝测试
测试时共用方法
/**
* 生成集合数据
*
* @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;
}
/**
* 修改值
*
* @param sourceList
*/
static void changeValue(List<CouponVo> sourceList) {
// 修改原集合数据
// 修改第一层属性值
sourceList.get(0).setActivityId("2");
// 修改嵌套对象的值
sourceList.get(0).getDiscountsUseRuleVOList().get(0).setRuleName("2");
}
/**
* 检查复制的结果是否是深浅拷贝
*
* @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构造方法(浅拷贝)
测试代码
/**
* 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);
}
运行结果
new ArrayList<>(list); 拷贝
第一层是否深拷贝:false
第二层是否深拷贝:false
list.addAll()方法(浅拷贝)
测试代码
/**
* 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);
}
运行结果
list.addAll(); 拷贝
第一层是否深拷贝:false
第二层是否深拷贝:false
list.stream().collect(Collectors.toList()); (浅拷贝)
测试代码
/**
* 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);
}
运行结果
list.stream().collect(Collectors.toList()); 拷贝
第一层是否深拷贝:false
第二层是否深拷贝:false
spring BeanUtils.copyProperties()方法 (第一层深拷贝,嵌套对象浅拷贝)
测试代码
/**
* 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);
}
运行结果
list.stream().map(o -> {
CouponVo couponVo = new CouponVo();
BeanUtils.copyProperties(o, couponVo);
return couponVo;
}).collect(Collectors.toList()); 拷贝
第一层是否深拷贝:true
第二层是否深拷贝:false
Hutool工具BeanUtil.copyToList方法(第一层深拷贝,嵌套对象浅拷贝)
测试代码
/**
* 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);
}
运行结果
BeanUtil.copyToList(list, CouponVo.class) 拷贝
第一层是否深拷贝:true
第二层是否深拷贝:false
fastjson 序列化反序列化方法(深拷贝)
测试代码
/**
* 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);
}
运行结果
JSONObject.parseArray(JSONObject.toJSONString(list), CouponVo.class); 拷贝
第一层是否深拷贝:true
第二层是否深拷贝:true
本文来自博客园,作者:HumorChen99,转载请注明原文链接:https://www.cnblogs.com/HumorChen/p/18039428