路过的大佬能,指点一下吗?

106 阅读1分钟

为了弄明白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

欢迎各位大佬指点一下