深拷贝,浅拷贝

浅拷贝:只拷贝基本类型的属性,引用类型的属性将地址付给新对象,所以浅拷贝后修改基本类型属性两个对象不会影响,修改引用类型属性会互相影响.浅拷贝可以用spring的 BeanUtils.copyProperties方法实现

深拷贝:基本类型和引用类型的属性都是真正的拷贝,所以深拷贝后修改基本类型和引用类型的属性都不会互相影响

浅拷贝实现代码:

 

package kun.copy;

import org.springframework.beans.BeanUtils;

public class TestBeanUtil {
 
    public static void main(String[] args) throws CloneNotSupportedException {
//spring的 BeanUtils.copyProperties的浅拷贝
        Address address = new Address();
        address.setAddress("汉中");
        Person p1 = new Person(100, "jim");
        p1.setAddress(address);
  Person p2 = new Person();
BeanUtils.copyProperties(p1,p2);
 p1.setNum(99);//修改p1对象中基本类型属性,不会影响p2 p2.setName("tom");//修改p2对象中基本类型属性,不会影响p1 p1.getAddress().setAddress("西安"); //浅拷贝不复制引用类型属性,只是将地址赋给新对象,所以修改p1中引用属性的值会影响p2 System.out.println(p1); // 99 jim 西安 System.out.println(p2);// 100 tom 西安  } }

深拷贝可以自己用流实现也可以用jackson工具


import com.fasterxml.jackson.databind.ObjectMapper;


public class DeepCopyDemo {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();


// 1. 创建原始对象:张三,住在北京
Address originalAddress = new Address("北京");
User original = new User("张三", originalAddress);


// 2. 使用 Jackson 进行深拷贝(就是那行核心代码)
User copy = mapper.readValue(mapper.writeValueAsString(original), User.class);//mapper.writeValueAsString(original)表示将original对象转成jason字符串,

//mapper.readValue表示jason字符串转成对象


// 3. 此时,original 和 copy 内容一样,但内存地址完全不同
System.out.println("原始用户地址:" + original.getAddress().getCity()); // 北京
System.out.println("拷贝用户地址:" + copy.getAddress().getCity()); // 北京


// 4. 关键验证:修改原始对象的地址
original.getAddress().setCity("上海");


// 5. 再次打印
System.out.println("修改后,原始用户地址:" + original.getAddress().getCity()); // 上海
System.out.println("修改后,拷贝用户地址:" + copy.getAddress().getCity()); // 北京 (没变!)

// 6. 检查内存地址是否相同(绝对不同)
System.out.println(original.getAddress() == copy.getAddress()); // 输出 false
}
}

 

 

posted @ 2023-06-04 16:20  杨吃羊  阅读(48)  评论(0)    收藏  举报