深浅拷贝的区别,多种语言代码示例,java、python、js

一大早到公司,我们的峰哥就遇到个问题,一通分析得出问题原因出自深浅拷贝。

深拷贝和浅拷贝都是指对于一个对象或数据结构进行复制操作的方式。二者的主要区别在于复制的方式不同,具体如下:

  • 浅拷贝(Shallow Copy): 浅拷贝是指新建一个对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,则拷贝的是引用类型的内存地址。因此,如果原始对象改变了这个属性值,则新对象的相应属性值也会发生变化。

  • 深拷贝(Deep Copy): 深拷贝是指新建一个对象,将原始对象的属性值的一份精确拷贝。不同的是,如果属性是引用类型,那么会递归遍历这个引用类型所引用的对象,并将这个对象的属性值也全部精确拷贝一份。因此,如果原始对象或任意一个被引用的对象改变了这个属性值,则新对象的相应属性值不会发生变化。

1、简单使用:以下代码示例(Java,C#,JavaScript,Python,Go)做简单的演示,用于说明深拷贝和浅拷贝的区别:

Java

//浅拷贝
MyClass original = new MyClass();
MyClass cloned = original;

//深拷贝
MyClass original = new MyClass();
//需要实现Cloneable接口并重写clone()方法
MyClass cloned = original.clone(); 

C#

//浅拷贝
MyClass original = new MyClass();
MyClass cloned = original;

//深拷贝
MyClass original = new MyClass();
//需要实现ICloneable接口并重写Clone()方法
MyClass cloned = original.DeepCopy(); 

JavaScript

//浅拷贝
var original = {a: 1, b: {c: 2}};
var cloned = Object.assign({}, original); 

//深拷贝
var original = {a: 1, b: {c: 2}};
var cloned = JSON.parse(JSON.stringify(original));

Python

#浅拷贝
original = [1, [2, 3], 4]
cloned = original.copy()

#深拷贝
import copy
original = [1, [2, 3], 4]
cloned = copy.deepcopy(original)

Go

//浅拷贝
original := []int{1, 2, 3, 4}
cloned := original

//深拷贝
package main

import (
    "fmt"
    "encoding/json"
)

type MyStruct struct {
    A int
    B string
}

func main() {
    original := &MyStruct{A: 1, B: "hello"}
    
    var cloned MyStruct
    b, _ := json.Marshal(original)
    json.Unmarshal(b, &cloned)
    
    fmt.Println(original, cloned)
}

需要注意的是,不是所有的编程语言都有内置的深拷贝和浅拷贝方法。在一些语言中,需要手动实现深拷贝和浅拷贝的操作。

2、Java 与Python 是我们常用的开发环境,下面是Java和Python的手动深拷贝和浅拷贝较为详细的代码实现示例:

Java

// MyClass定义
class MyClass implements Cloneable {
    public int a;
    public int[] b;

    public Object clone() throws CloneNotSupportedException {
        MyClass cloned = (MyClass)super.clone();
        cloned.b = b.clone(); // 对于引用类型,需要手动拷贝
        return cloned;
    }
}

// 浅拷贝
MyClass original = new MyClass();
MyClass cloned = original;

// 深拷贝
MyClass original = new MyClass();
MyClass cloned = (MyClass)original.clone();

Python

import copy

# MyClass定义
class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def shallow_copy(self):
        return copy.copy(self)

    def deep_copy(self):
        return copy.deepcopy(self)

# 浅拷贝
original = MyClass(a=1, b=[2, 3])
cloned = original.shallow_copy()

# 深拷贝
original = MyClass(a=1, b=[2, 3])
cloned = original.deep_copy()

需要注意的是,在手动实现深拷贝和浅拷贝的时候,对于引用类型的成员变量,需要递归调用深拷贝或浅拷贝的方法,否则拷贝后的对象就不是真正意义上的深拷贝或浅拷贝。此外,对于一些复杂的数据结构,手动实现深拷贝或浅拷贝可能会比较困难,这时候可以考虑使用一些开源的拷贝库,比如Java中的Apache Commons Lang包中的SerializationUtils类,或者Python中的copy模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值