首页 > 其他分享 >数据类型与深浅拷贝理解 vs 不同语言环境下深浅拷贝实例

数据类型与深浅拷贝理解 vs 不同语言环境下深浅拷贝实例

时间:2024-06-12 17:31:21浏览次数:21  
标签:存储 指向 数据类型 深浅 拷贝 数据 指针

一、在探讨深浅拷贝的问题之前需要先理解两种数据类型

  1. 值类型数据(基本数据类型):存储在栈内存,占据固定大小的空间,直接存储其数据(值的赋值是深拷贝);
  2. 引用类型数据:这种数据类型的变量通常存储在栈区,存的是指向实际数据的指针,而实际的数据是存储在堆区,访问数据通过指针去访问(值的赋值可以是浅拷贝也可以是深拷贝);

二、深拷贝 VS 浅拷贝

深拷贝
  • 深拷贝是在内存中重新开辟了一个新的内存空间来存储数据
浅拷贝
  • 浅拷贝是多个指针指向一份共同的内存
举例
  • 值类型的深拷贝:比如 a = 10 ,这里的数据a是值类型,直接存储数字10,存储在栈区的某个地方,暂且叫做k区域,当赋值操作b = a 的时候实际是重新在内存中开辟了一份新的空间m区域,存储的值也是10,这个时候 a = 10 ,b也等于10,更改a或者b的值不会相互影响,值类型赋值都会重新开辟一个新的存储空间,所以不存在浅拷贝。

  • 引用类型数据:比如a = [1,3,4,4],这里a是指针,存储在栈区,数组[1,3,4,4]是指针a指向的数据,存储在堆区,当要访问数组的时候通过指针a去访问,现在如果把a的值深拷贝给b,相当于在堆区开辟了一个新的空间,存储新的一份数组[1,3,4,4],这个时候实际的数据在堆区就有两分,a指向一份,b指向一份。但是假如把a的值浅拷贝给b,那实际上做的事情是把指针b也指向了a指向的那个数组[1,3,4,4],结果是a、b指向的是同一份内存,当改变a的值b也会跟着改变。总结一下,深拷贝操作的是实际存储的数据,把数据复制一份或者多份出来分别存储,而浅拷贝实际上只是移动了指针,把多个指针指向同一份数据,所以在浅拷贝复制的时候往往速度会更快。

三、不同语言之间实现深浅拷贝

  • Object-C:

    • 值类型数据:数值型、字符型(char)、bool、void

    • 引用类型: 包括类类型(如NSString、NSArray、NSDictionary等)和块类型(block)

    • oc深浅拷贝较复杂,其实可以把copy 和 mutableCopy统统归为浅拷贝,因为他们要么是指针的复制,也就是完全的浅拷贝,要么只是是拷贝一层,没有完全实现深拷贝,归档才是真正意义上的深拷贝,

      • 拷贝一层或者浅拷贝:【a copy】 或者【a mutableCopy】,例如调用NSArray的mutableCopy方法时,将会返回一个NSMutableArray对象,表面看这个是深拷贝,因为确实是复制了一份内存出来,但是实际上他只是拷贝了一层,比如数组里是字符串,那两分内存数组中的字符串指向的是同一份地址。
      • 拷贝两层:[[数据类型对象 alloc]initwith:拷贝目标 copyitems:yes]
      • 深拷贝:归档[nskeyedunarchiver unarchiveobjectwithdata:[nskeyedarchiver archiveddatawithrootobject:拷贝目标]]
  • python:

    • 值类型数据:

      • 整数(int)
      • 浮点数(float)
      • 复数(complex)
      • 字符串(str)
      • 布尔值(bool)
      • 空值(None)
    • 引用数据类型:

      • 列表list
      • 元组tuple
      • 字典dict
      • 集合set
    • 浅拷贝:copy()

    • 深拷贝:deepcopy()

  • js:

    • 值类型数据:Number string null undefined boolean Symbol(ES6)、Bigint(ES10)

    • 引用数据类型:Array Object function

    • 浅拷贝:

      • 直接赋值(直接赋值只是指针的复制,比如a指向一个地址,赋值a给b,实际含义是b直接指向a指向的地址)
      • slice()
      • concat()
      • Array.from
      • Object.assign:对象合并
    • 深拷贝

      • 序列化
        • JSON.stringfy() 将对象序列化成json对象,
        • JSON.parse() 反序列化——将json对象反序列化成js对象

标签:存储,指向,数据类型,深浅,拷贝,数据,指针
From: https://blog.csdn.net/j15087159186/article/details/139630612

相关文章

  • go的深拷贝跟浅拷贝
    Golang面试官:聊一聊浅拷贝和深拷贝原创 吃个大西瓜 CodingBigTree 2024-06-0908:01 北京 听全文浅拷贝和深拷贝浅拷贝后的对象和源对象是同一个对象,值被修改,原值的数据也会被修改深拷贝后的对象,是一个全新的对象,和源对象没有关系,修改值不会相互影响浅拷贝示......
  • 浅拷贝与深拷贝全面解析及实战
    在JavaScript学习中,拷贝是很重要的一个知识点。拷贝主要分为浅拷贝(ShallowCopy)和深拷贝(DeepCopy)。本文将阐述两者的概念,还将通过手写示例深入探讨如何实现这两种拷贝方式,以及它们在实际应用中的考量。浅拷贝:表面级复制浅拷贝只复制对象的第一层属性,对于嵌套对象或数组,仅复......
  • Redis 的数据类型及各数据类型的命令还有其应用场景
    String类型(适用于大部分)含义String类型包含多种类型的特殊类型,并且是二进制安全的.比如序列化的对象进行存储,比如一张图片进行二进制存储.,比如一个简单的      命令setrangekeyindexvalue->修改键对应的值,index表示开始的索引位置ttl->可以查询......
  • 基本数据类型 String,null 和 undefined,运算符,流程控制,JavaScript之数组,数组常用
    Ⅰ基本数据类型String【一】String类型String类型就是字符串类型【二】定义变量【1】常规变量var变量名="变量值";//一般用这种var变量名='变量值';不支持三引号【2】可以先声明不赋值先用varb;再对变量b赋值varb='6';【三】字符串的格式化输出语法......
  • CH02_数据类型
    CH02_数据类型数据类型整型描述:整型变量表示的是整型类型的数据,C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同。数据类型占用空间取值范围short(短整型)2字节-2^15~2^15-1int(整型)4字节-2^31~2^31-1long(长整型)windows为4字节,Li......
  • C语言中的数据类型及其转换
    目录计算机中的数据类型整型数据之间的转换相同字长之间的转换小字长转大字长大字长转小字长int、float、double之间的转换float->doubledouble->floatfloat/double->intint->floatint->double计算机中的数据类型计算机中的数据以二进制的形式存储在寄存器或存储器中。机器怎......
  • 执行异步派发时, 需要拷贝块
    dispatch_async在执行异步派发时,需要拷贝block。Block的行为在Objective-C中,block是带有自动变量(局部变量)和堆栈信息的代码段。当你声明一个block,它默认存储在栈上。这意味着,当函数返回时,block可能不再有效。为了确保block在需要时仍然有效,block通常会被拷贝......
  • 零拷贝
    普通流程网络IO读写流程应用进程的每一次写操作,都会把数据写到用户空间的缓冲区中,再由CPU将数据拷贝到系统内核的缓冲区中,之后再由DMA将这份数据拷贝到网卡中,最后由网卡发送出去。这里我们可以看到,一次写操作数据要拷贝两次才能通过网卡发送出去,而用户进程的读操作则是将整个......
  • Python中的浅拷贝与深拷贝
    Python中值的拷贝可分为直接赋值,浅拷贝与深拷贝直接赋值:即为对象的引用,赋值前后的对象均指向同一对象浅拷贝:拷贝父对象,拷贝前与拷贝后的对象均为独立的对象,但是他们的子对象都仍然指向同一对象深拷贝:完全拷贝父对象及子对象,拷贝前与拷贝后的对象均独立存在演示代码如下import......
  • 第四章: 全面梳理Java 标识符变量的声明,基本数据类型,String类型以及相互之间的类型
    1.关键字和保留字关键字(keyword)是指被Java语言赋予了特殊含义,用做专门用途的字符串(单词)其特点就是关键字中所有字母都为小写官方地址:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html保留字(reservedword)是当前Java版本尚未使用,但以......