对象的深拷贝

//缓存已经处理的obj,不然环形报错
let cacheMap=new WeakMap()
function deepClone(obj){
  //基本类型,数值 null之类的
  if(typeof obj!=='object'||!obj){
    return obj;
  }
  if(cacheMap.has(obj)){
    //存在就直接返回
    return cacheMap.get(obj)
  }
  //正则
  if(obj instanceof RegExp){
     let tmp=new RegExp(obj)
     cacheMap.set(obj,tmp)
     return tmp;
  //map
  }else if(obj instanceof Map){
     let tmp=new Map()
     cacheMap.set(obj,tmp)

     obj.forEach((val,key)=>{
       tmp.set(deepClone(key),deepClone(val))
     })
     return tmp;
     //set
  }else if(obj instanceof Set){
    let tmp=new Set()
    cacheMap.set(obj,tmp)
     obj.forEach((val)=>{
       tmp.add(deepClone(val))
     })
     return tmp;
     //obj等
  }else{
    let tmp=new obj.constructor()
    cacheMap.set(obj,tmp)
    for(let key in obj){
      tmp[key]=deepClone(obj[key])
    }
    return tmp
  }
}

  • 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、付费专栏及课程。

余额充值