深拷贝,浅拷贝
浅拷贝:只拷贝基本类型的属性,引用类型的属性将地址付给新对象,所以浅拷贝后修改基本类型属性两个对象不会影响,修改引用类型属性会互相影响.浅拷贝可以用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
}
}
浙公网安备 33010602011771号