对象深拷贝

public Object deepClone(Object obj) {
  //将对象写到流里
  ByteArrayOutoutStream bo= new ByteArrayOutputStream();
  ObjectOutputStream oo= new ObjectOutputStream(bo);
  oo.writeObject(obj );
  //从流里读出来
  ByteArrayInputStream bi= new ByteArrayInputStream(bo.toByteArray());
  ObjectInputStream oi= new ObjectInputStream(bi);
  return (oi.readObject());
}

===================================================================================
泛型版本:
@SuppressWarnings("unchecked")
private static <T> T copy(T t) throws Exception {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(t);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (T) (oi.readObject());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的对象拷贝有两种方式:浅拷贝和深拷贝。 浅拷贝是指创建一个新对象,新对象中的引用类型字段仍然指向原对象中对应字段的引用。这意味着修改新对象中的引用类型字段也会影响原对象。可以通过实现 Cloneable 接口并重写 clone() 方法来实现浅拷贝。 示例代码如下: ```java class MyClass implements Cloneable { private int value; private MyObject myObject; public MyClass(int value, MyObject myObject) { this.value = value; this.myObject = myObject; } // 重写 clone() 方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class MyObject { // ... } public class Main { public static void main(String[] args) throws CloneNotSupportedException { MyObject obj = new MyObject(); MyClass obj1 = new MyClass(10, obj); // 浅拷贝 MyClass obj2 = (MyClass) obj1.clone(); // obj1 和 obj2 是两个独立的对象,但是它们的 myObject 字段引用同一个对象 System.out.println(obj1 == obj2); // false System.out.println(obj1.myObject == obj2.myObject); // true } } ``` 深拷贝是指创建一个新对象,同时递归地复制原对象及其引用类型字段所引用的对象。这样在修改新对象时不会影响原对象。可以通过实现 Serializable 接口并使用序列化/反序列化来实现深拷贝。 示例代码如下: ```java import java.io.*; class MyClass implements Serializable { private int value; private MyObject myObject; public MyClass(int value, MyObject myObject) { this.value = value; this.myObject = myObject; } // 深拷贝 public MyClass deepClone() throws IOException, ClassNotFoundException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(this); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); return (MyClass) objectInputStream.readObject(); } } class MyObject implements Serializable { // ... } public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { MyObject obj = new MyObject(); MyClass obj1 = new MyClass(10, obj); // 深拷贝 MyClass obj2 = obj1.deepClone(); // obj1 和 obj2 是两个独立的对象,它们的 myObject 字段引用不同的对象 System.out.println(obj1 == obj2); // false System.out.println(obj1.myObject == obj2.myObject); // false } } ``` 上述代码中,通过使用序列化/反序列化实现了深拷贝。在 `deepClone()` 方法中,首先将对象写入字节数组输出流,然后通过字节数组输入流读取字节数组并反序列化为一个新的对象。这样就能够得到一个与原对象完全独立的新对象,包括其引用类型字段所引用的对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值