深拷贝和浅拷贝的实现

深拷贝方法:

  1. JSON.parse() 和 JSON.stringify()
function deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj))
}

缺陷:
当被转化的对象里含有时间对象这种格式的数据会被转化为字符串
当被转化的对象里含有regexp格式这种的数据会被转化为空对象
当被转化的对象里含有function转化后数据会丢失

  1. 递归
function deepCopy(obj) {
    // 没有引用数据类型时停止递归
    if (typeof obj !== 'object') return
    // 判断是对象还是数组
    let newObj = obj instanceof Array ? [] : {}
    for (let key in obj) {
        // 含有该obj的可枚举属性才进行拷贝
        if (obj.hasOwnProperty(key)) {
            if (typeof obj[key] === "object") {
                newObj[key] = deepCopy(obj[key])
            }
            else {
                newObj[key] = obj[key]
            }
        }
    }
    return newObj
}

缺陷:特殊情景下和JOSN方法一样

浅拷贝方法

  1. 直接赋值
  2. Object.assign()
### Java 中的深拷贝浅拷贝 在Java中,对象的复制可以通过深拷贝浅拷贝来完成。两者的主要区别在于处理对象内部引用的方式。 #### 浅拷贝 (Shallow Copy) 浅拷贝会创建一个新的对象,这个新对象会拥有原对象属性值的一份精确拷贝。但是,如果这些属性指向的是其他对象,则只会复制这些对象的引用地址,而不是创建新的对象实例[^1]。 ```java public class ShallowCopyExample implements Cloneable { private int value; private Object reference; public ShallowCopyExample(int value, Object reference) { this.value = value; this.reference = reference; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` 上述代码展示了如何利用`Cloneable`接口实现浅拷贝功能。需要注意的是,默认情况下,`clone()`方法仅执行字段级别的复制,并不会递归地克隆嵌套的对象结构[^2]。 #### 深拷贝 (Deep Copy) 相比之下,深拷贝不仅复制了对象本身的数据成员,还会递归地复制所有被该对象持有的子对象。这意味着即使是最深层级的对象也会得到全新的独立副本,从而确保两个对象之间没有任何共享状态。 一种常见的做法是在类中重写`clone()`方法并手动调用每个非基本类型的成员变量对应的`clone()`方法: ```java import java.util.ArrayList; import java.util.List; class DeepCopyExample implements Cloneable { private List<String> list; public DeepCopyExample(List<String> list) { this.list = new ArrayList<>(list); } @Override protected DeepCopyExample clone() throws CloneNotSupportedException { // 创建当前对象的新实例 DeepCopyExample clonedObject = (DeepCopyExample)super.clone(); // 对于每一个复杂类型成员都重新分配内存空间 clonedObject.list = new ArrayList<>(); for(String item : this.list){ clonedObject.list.add(new String(item)); } return clonedObject; } } ``` 这段代码实现了对列表内字符串元素的安全复制,避免了源对象与其副本次数之间的相互影响。 --- ### Python 中的深拷贝浅拷贝 Python同样支持两种不同的对象复制机制——浅拷贝深拷贝。为了更好地理解区分这两者,在这里提供具体的例子说明其工作原理。 #### 使用 `copy.copy()` 实现浅拷贝 当使用内置模块`copy`下的函数`copy()`来进行浅拷贝时,只会在顶层容器级别上创建新的实体;而对于其中包含的任何可变数据项(比如列表、字典),则依旧保持原有的引用关系[^3]。 ```python from copy import copy original_list = [[1], [2]] shallow_copied_list = copy(original_list) print(shallow_copied_list is original_list) # False print(shallow_copied_list[0] is original_list[0]) # True ``` 此示例表明虽然外部列表已经被成功复制,但内部的小列表仍然指向相同的内存位置。 #### 使用 `copy.deepcopy()` 进行完全隔离的深拷贝 要真正意义上获得一个全新且独立的对象树形结构,应该采用`deepcopy()`函数。这将遍历整个对象图谱直至叶子节点处逐一建立新的实例,最终达到绝对意义上的分离效果[^4]。 ```python from copy import deepcopy original_dict = {"key": ["value"]} deep_copied_dict = deepcopy(original_dict) print(deep_copied_dict is original_dict) # False print(deep_copied_dict["key"] is original_dict["key"]) # False ``` 通过这种方式,无论是顶级还是底层的数据都被完整无误地重建出来,使得修改任意一方都不会波及另一方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值