为了弄明白Hutool工具的BeanUtil.copyProperties()方法的深浅拷贝问题,我做了如下实验,但是结果让我更懵了。
@Data
public class Car {
private Integer price;
private List<Brand> brands;
}
@Data
public class Brand {
private String address;
private List<String> zi;
}
测试代码:
public class Test {
public static void main(String[] args) {
Car car = new Car();
List<Brand> brands = new ArrayList<>();
for (int i = 0; i < 2; i++) {
Brand brand = new Brand();
brand.setAddress("北京" + i);
List<String> zis = new ArrayList<>();
zis.add("小米");
zis.add("红米");
brand.setZi(zis);
brands.add(brand);
}
car.setPrice(1000);
car.setBrands(brands);
// Car car1 = new Car();
Car car1 = BeanUtil.copyProperties(car, Car.class);
// ArrayList<Brand> brands1 = new ArrayList<>();
// Brand brand = new Brand();
// brand.setAddress("上海");
// brands1.add(brand);
// car1.setBrands(brands1);
// car1.setPrice(1500);
System.out.println(car);
System.out.println(car1);
System.out.println(car.hashCode());
System.out.println(car1.hashCode());
System.out.println(car.equals(car1));
}
}
运行结果:
Car(price=1000, brands=[Brand(address=北京0, zi=[小米, 红米]), Brand(address=北京1, zi=[小米, 红米])])
Car(price=1000, brands=[Brand(address=北京0, zi=[小米, 红米]), Brand(address=北京1, zi=[小米, 红米])])
1907280909
1907280909
true
但是对拷贝的对象进行修改属性时结果变成了这样:
Car(price=1000, brands=[Brand(address=北京0, zi=[小米, 红米]), Brand(address=北京1, zi=[小米, 红米])])
Car(price=1500, brands=[Brand(address=上海, zi=null)])
1907280909
38288655
false
欢迎各位大佬指点一下