.NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)

今天继续利用准备WSE安全开发文章的空闲时间,完善《.NET深入学习笔记》系列(基本都是.Net重要的知识点,我都做了详细的总结,是什么、为什么、和怎么实现)。想必很多人也接触过这两个概念。做过C++的人对深浅拷贝的概念一定不会陌生。而其很多C#高级软件工程师的面试里也会问到深浅拷贝相关的问题。我今天就在总结一下,并且添加了详细的代码实现,与大家分享。一起学习一下C#的深拷贝与浅拷贝(Deep Copy and Shallow Copy)的机制。全文还是分四部分:1.基本概念  2.深拷贝与浅拷贝实现机制 3.代码实现和分析 4.总结。下面我们来进入正式的学习。
1.基本概念:
首先我们应该了解一下什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy)。
a.浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用。
      b.深拷贝(Deep Copy 深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。
我们知道,在C++中有拷贝构造函数和拷贝赋值函数的概念。浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以指堆资源,或者一个文件。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的资源,但资源的内容是一样的。对于堆资源来说,就是在开辟一片堆内存,把原来的内容拷贝。  

    如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝,就是深拷贝  
   这个C#里的概念与C++类似。我们可以参考以前的概念理解。 深拷贝与浅拷贝之间的区别基本可以从定义看出。首先浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。
深拷贝拷贝不同的是对于引用拷贝的处理,深拷贝将会在新对象中创建和原是对象中对应值类型的字段并且赋值。浅拷贝不会创建新引用类型,会返回相同的类型引用。深拷贝会重新创建新对象,返回新对象的引用字。C#中的观察者模式就是浅拷贝的例子。我们保留的只是对象的副本。
  2.深拷贝与浅拷贝实现机制:
从上面的概念我们了解了C#深拷贝与浅拷贝(Deep Copy and Shallow Copy)的不同之处。这个也就决定了两者有不同的实现方式。
对于值类型:
    a.浅拷贝: 通过赋值等操作直接实现,将对象中的值类型的字段拷贝到新的对象中。      
    b.深拷贝:通过赋值等操作直接实现,将对象中的值类型的字段拷贝到新的对象中。   和浅拷贝相同
对于引用类型:
    a.浅拷贝: MemberwiseClone 方法创建一个浅副本,方法是创建一个新对象,如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用原始对象,与原对象引用同一对象。
b.深拷贝:拷贝对象应用,也拷贝对象实际内容,也就是创建了一个新的改变新对象 不会影响到原始对象的内容  
这种情况需要为其实现ICloneable接口中提供的Clone方法。
差别就是在对于引用类型的实现深拷贝和浅拷贝的时候的机制不同,前者是MemberwiseClone 方法实现,后者是通过继承实现ICloneable接口中提供的Clone方法,实现对象的深拷贝。
3.代码实现和分析:
下面我们来看看具体的代码实现部分,首先介绍的还是值类型的。
a.值类型浅拷贝的实现。代码如下:
/// <summary> 
InBlock.gif                ///    数组的=赋值(直接拷贝),也就是引用传递,指向的是同一个地址: 
InBlock.gif                /// </summary> 
InBlock.gif                public void MethodShallowCopyDirectly() 
InBlock.gif                { 
InBlock.gif                        int[] ArrayInt = { 0, 1, 2, 3 }; 
InBlock.gif 
InBlock.gif                        //所以改变其中任意一个变量的值,另一个也会被改变 
InBlock.gif                        int[] NewArrayInt = ArrayInt; 
InBlock.gif                        //改变新的数组变量: 
InBlock.gif                        NewArrayInt[0] = 8; 
InBlock.gif                        Console.WriteLine("数组的复制(直接拷贝),改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]); 
InBlock.gif                } 
InBlock.gif                /// <summary> 
InBlock.gif                /// ArrayInt.CopyTo,创建以个新数组,不影响原来的值 
InBlock.gif                /// </summary> 
InBlock.gif                public void MethodShallowCopyArrayCopyTo() 
InBlock.gif                { 
InBlock.gif                        int[] ArrayInt = { 0, 1, 2, 3 };            
InBlock.gif 
InBlock.gif                        //CopyTo()方法 
InBlock.gif                        int[] NewArrayInt = new int[5];//创建以个新数组,按值拷贝,不影响原来的值 
InBlock.gif                        ArrayInt.CopyTo(NewArrayInt, 0); 
InBlock.gif                        NewArrayInt[0] = 8; 
InBlock.gif                        Console.WriteLine("Array.CopyTo,改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]); 
InBlock.gif                 
InBlock.gif                } 
InBlock.gif                /// <summary> 
InBlock.gif                /// Array.Copy浅拷贝,值类型的浅拷贝,创建以个新数组,按值拷贝,不影响原来的值 
InBlock.gif                /// </summary> 
InBlock.gif                public void MethodShallowCopyArrayCopy() 
InBlock.gif                { 
InBlock.gif                        int[] ArrayInt = { 0, 1, 2, 3 }; 
InBlock.gif                        //Copy()方法 
InBlock.gif                        int[] NewArrayInt = new int[4]; 
InBlock.gif                        Array.Copy(ArrayInt, NewArrayInt, 0);//创建以个新数组,按值拷贝,不影响原来的值 
InBlock.gif                        NewArrayInt[0] = 8; 
InBlock.gif                        Console.WriteLine("Array.Copy,改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]); 
InBlock.gif 
InBlock.gif                } 
InBlock.gif                /// <summary> 
InBlock.gif                /// Array.Clone(),浅拷贝 
InBlock.gif                /// </summary> 
InBlock.gif                public void MethodShallowCopyArrayClone() 
InBlock.gif                { 
InBlock.gif                        int[] ArrayInt = { 0, 1, 2, 3 }; 
InBlock.gif                        //Array Clone()方法 
InBlock.gif                        int[] NewArrayInt = ArrayInt.Clone() as int[];//按值拷贝,不影响原来的值 
InBlock.gif                        NewArrayInt[0] = 8; 
InBlock.gif                        Console.WriteLine("Array.Clone(),改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]); 
InBlock.gif                } 
InBlock.gif                /// <summary> 
InBlock.gif                /// .浅拷贝:(引用类型),数组中的元素是引用类型,复制的是它的一个引用,改变新拷贝会改变原对象 
InBlock.gif                /// </summary> 
InBlock.gif                public void MethodShallowCopyStringArrayCopyTo() 
InBlock.gif                { 
InBlock.gif                        string[] sArray ={ "string0""string1""string2" }; 
InBlock.gif                        string[] sNewArray = sArray; 
InBlock.gif                        //浅拷贝一个新对象 
InBlock.gif                        sArray.CopyTo(sNewArray, 0); 
InBlock.gif 
InBlock.gif                        //改变新对象的值这个时候源对象中的值也会被改变 
InBlock.gif                        sNewArray[0] = "FrankXuLei"
InBlock.gif                        Console.WriteLine("数组的浅拷贝:(引用类型),改变第一值为FrankXuLei,原值{0},新值{1}", sArray[0], sNewArray[0]); 
InBlock.gif                } 
InBlock.gif                /// <summary> 
InBlock.gif                ///    //字符串数组的深拷贝,如果需要包含引用类型的数组的深副本,就必须迭代数组,创建新对象 
InBlock.gif                /// </summary> 
InBlock.gif                public void MethodDeepCopyStringArray() 
InBlock.gif                { 
InBlock.gif                        string[] sArray = new string[] { "string0""string1""string2""string3" }; 
InBlock.gif                        string[] sNewArray = new string[4];//迭代数组,创建新对象 
InBlock.gif                        for (int i = 0; i < sArray.Length; i++) 
InBlock.gif                        { 
InBlock.gif                                string sTemp = string.Empty; 
InBlock.gif                                sTemp = sArray[i]; 
InBlock.gif                                sNewArray[i] = sTemp; 
InBlock.gif                        } 
InBlock.gif                        sNewArray[0] = "FrankXuLei"
InBlock.gif                        Console.WriteLine("数组的复制(直接拷贝),改变新数组第一值为FrankXuLei,原值{0},新值{1}", sArray[0], sNewArray[0]); 
InBlock.gif                } 
数组的=赋值(直接拷贝),也就是引用传递,指向的是同一个地址,所以改变其中任意一个变量的值,另一个也会被改变。ArrayInt.CopyTo,创建以个新数组,改变新的数组变量不影响原来的值。Array.Copy浅拷贝,值类型的浅拷贝,创建以个新数组,按值拷贝,不影响原来的值。 .浅拷贝:(引用类型),数组中的元素是引用类型,复制的是它的一个引用,改变新拷贝会改变原对象.
b.引用类型的深拷贝实现:
定义了以个汽车类,继承接口继承接口ICloneable。
InBlock.gifpublic class CarDeepClone : ICloneable 
InBlock.gif        { 
InBlock.gif                //名称,引用类型 
InBlock.gif                public string _name = string.Empty; 
InBlock.gif                //价格,值得类型 
InBlock.gif                public int _price = 0; 
InBlock.gif                //构造函数 
InBlock.gif                public CarDeepClone() 
InBlock.gif                { 
InBlock.gif                } 
InBlock.gif                //重载构造函数 
InBlock.gif                public    CarDeepClone(string name, int price) 
InBlock.gif                { 
InBlock.gif                        _name = name; 
InBlock.gif                        _price = price; 
InBlock.gif                } 
InBlock.gif                //深拷贝,需要重新生成对象,返回的新对象的实例 
InBlock.gif                public object Clone() 
InBlock.gif                { 
InBlock.gif 
InBlock.gif                        //深复制     
InBlock.gif                        CarDeepClone obj = new CarDeepClone();//重新创建 CarDeepClone的对象 
InBlock.gif                        //obj.Member=     (ClassA)Member.Clone();     
InBlock.gif                        return obj; 
InBlock.gif                } 
InBlock.gif        } 
c.引用类型的浅拷贝实现:
浅拷贝实现的方法是this.MemberwiseClone();创建当前对象的浅副本 ,返回相同的对象引用。而深拷贝的实现代码是通过 CarDeepClone obj = new CarDeepClone();重新创建 CarDeepClone的对象。这个是两者在实现上不同的地方。
InBlock.gifpublic class CarShallowClone : ICloneable 
InBlock.gif        { 
InBlock.gif                //名称,引用类型 
InBlock.gif                public string _name = string.Empty; 
InBlock.gif                //价格,值得类型 
InBlock.gif                public int _price = 0; 
InBlock.gif                //构造函数 
InBlock.gif                public    CarShallowClone(string name, int price) 
InBlock.gif                { 
InBlock.gif                        _name = name; 
InBlock.gif                        _price = price; 
InBlock.gif                } 
InBlock.gif                //浅拷贝,MemberwiseClone方式返回对象的浅副本 
InBlock.gif                public object Clone() 
InBlock.gif                { 
InBlock.gif                        return this.MemberwiseClone();//创建当前对象的浅副本 ,返回相同的对象引用 
InBlock.gif                } 
InBlock.gif        }
d.客户端测试代码实现:
包括值类型的浅拷贝和string类型数组的深拷贝的实现测试。以及对象的深拷贝和浅拷贝的测试。具体代码如下:
InBlock.gifValueTypeCopy _ShallowCopy = new ValueTypeCopy(); 
InBlock.gif                        Console.WriteLine("Value Type Shallow Copy Demo 值类型浅拷贝。。。。。。。。。。。。。。。。。。"); 
InBlock.gif                        _ShallowCopy.MethodShallowCopyDirectly();//直接赋值 
InBlock.gif                        _ShallowCopy.MethodShallowCopyArrayClone();//调用数组的Clone()方法,浅副本 
InBlock.gif                        _ShallowCopy.MethodShallowCopyArrayCopy();//ArrayCopy方法 
InBlock.gif                        _ShallowCopy.MethodShallowCopyArrayCopyTo();//ArrayCopyTo()方法 
InBlock.gif                        _ShallowCopy.MethodShallowCopyStringArrayCopyTo();//ArrayCopyTo()方法 
InBlock.gif    
InBlock.gif                        _ShallowCopy.MethodDeepCopyStringArray();//深拷贝字符数组 
InBlock.gif 
InBlock.gif    
InBlock.gif 
InBlock.gif                        //DeepCopy Test深拷贝,重新生成对象,对新对象的修改不会改变原来对象的值 
InBlock.gif                        Console.WriteLine("Object Deep        Copy Demo    对象深拷贝。。。。。。。。。。。。。。。。。。。。。"); 
InBlock.gif                        CarDeepClone _CarDeepClone1 = new CarDeepClone("Benz700",700); 
InBlock.gif                        //深拷贝 
InBlock.gif                        Console.WriteLine("DeepCopy Test深拷贝,原对象名字{0}", _CarDeepClone1._name); 
InBlock.gif                        CarDeepClone _CarDeepClone2 = _CarDeepClone1.Clone() as CarDeepClone; 
InBlock.gif 
InBlock.gif                        Console.WriteLine("DeepCopy Test深拷贝,新对象名字{0}", _CarDeepClone2._name); 
InBlock.gif                        //修改新对象的名字 
InBlock.gif                        _CarDeepClone2._name = "Benz800"
InBlock.gif                        Console.WriteLine("DeepCopy Test深拷贝,新对象名字修改为{0}", _CarDeepClone2._name); 
InBlock.gif                        //输出对象信息 
InBlock.gif                        Console.WriteLine("DeepCopy Test深拷贝,原对象名字为{0},新对象名字为{1}", _CarDeepClone1._name, _CarDeepClone2._name); 
InBlock.gif 
InBlock.gif                        //ShallowCopy Test浅拷贝,新对象的修改会改变原来对象的值得 
InBlock.gif                        Console.WriteLine("Object Shallow Copy Demo    对象浅拷贝。。。。。。。。。。。。。。。。。。。。。"); 
InBlock.gif                        CarShallowClone _CarShallowClone1 = new CarShallowClone("BMW3", 300); 
InBlock.gif                        Console.WriteLine("ShallowCopy Test浅拷贝,原对象名字{0}", _CarShallowClone1._name); 
InBlock.gif                        //浅拷贝对象 
InBlock.gif                        CarShallowClone _CarShallowClone2 = _CarShallowClone1.Clone() as CarShallowClone; 
InBlock.gif                        Console.WriteLine("ShallowCopy Test浅拷贝,新对象名字{0}", _CarShallowClone2._name); 
InBlock.gif                        //修改新对象名字 
InBlock.gif                        _CarShallowClone2._name = "BMW7"
InBlock.gif                        Console.WriteLine("ShallowCopy Test浅拷贝,新对象名字修改为{0}", _CarShallowClone2._name); 
InBlock.gif                        //输出对象信息 
InBlock.gif                        Console.WriteLine("ShallowCopy Test浅拷贝,原对象名字{0},新对象名字{1}", _CarShallowClone1._name, _CarShallowClone2._name); 
首先测试的值类型的不同的浅拷贝方法,实例化类ValueTypeCopy _ShallowCopy = new ValueTypeCopy();
    进行 值类型浅拷测试贝。分别包括:   _ShallowCopy.MethodShallowCopyDirectly();直接赋值拷贝,
            _ShallowCopy.MethodShallowCopyArrayClone();调用数组的Clone()方法,浅副本
            _ShallowCopy.MethodShallowCopyArrayCopy();ArrayCopy方法
            _ShallowCopy.MethodShallowCopyArrayCopyTo();ArrayCopyTo()方法
            _ShallowCopy.MethodShallowCopyStringArrayCopyTo();ArrayCopyTo()方法
             _ShallowCopy.MethodDeepCopyStringArray();深拷贝字符数组后面代码主要是对对象深浅拷贝的不同测试。
运行结果如下图:
4.总结
通过以上内容的学习,希望大家对C#中的深拷贝与浅拷贝(Deep Copy and Shallow Copy)的机制能有更深入的了解。我在总结这个文章的时候也查阅了MSDN及C#书籍等资料。与大家一起分享。有问题的也可以留言一起交流~共同学习进步~(最后附上本次实现的代码。下载地址
/Files/frank_xl/CloneDemoFrankXuLei.zip 。前几天忙硕士论文的事情,没时间更新blog,现在抓紧时间继续准备WSE3.0安全开发的文章,应该最近会写出来。主要是涉及到的知识点很多,需要时间学习,而且开发环境配置比较复杂。代码插入出了问题,有js错误,请大家下载代码)



本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/318538,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VIM一般模式操作

2019独角兽企业重金招聘Python工程师标准>>> vim介绍 vim和vi几乎是一样的&#xff0c;唯一的区别就是当编辑一个文本时&#xff0c;使用vi不会显示颜色&#xff0c;而使用vim会显示颜色。 vim有三个模式&#xff1a;一般模式&#xff0c;编辑模式&#xff0c;命令模…

stateful set 学习笔记

2019独角兽企业重金招聘Python工程师标准>>> 1、创建pv # cat pv.yaml kind: PersistentVolume apiVersion: v1 metadata:name: task-pv-volumelabels:type: local spec:capacity:storage: 3GiaccessModes:- ReadWriteOncehostPath:path: "/tmp/data" 2、…

自定义控件---重写Listbox实现item图标变换和item点击事件

博客开通有一阵了&#xff0c;就是没有时间写&#xff0c;遗憾啊。&#xff01; 这几天做了个排序的自定义控件&#xff0c;在listbox item里放是button 并支持图标的交替变换 效果如下&#xff1a; 把代码贴上&#xff1a;1using System; 2using System.Collections.…

MySQL初识-架构-安装-初始化-连接-管理工具-数据文件

MySQL架构和结构分析 官方架构图 内部组件结构图 MySQL安装方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客户端命令mysql> help # 获取命令帮助 mysql> \? # 同上 mysql> \c # 取消命令执行 mysq…

mdm.Dialogs.promptModal()使用

这是prompt的扩展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按钮和图标import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 启动程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

Gson的使用,对于不需要html escape的情况的处理

引入&#xff1a; 虽然是小问题&#xff0c;但是我还是需要记录下&#xff0c;我们知道&#xff0c;Google提供了一个Gson框架让我们高效的吧普通对象&#xff08;一般VO为佳&#xff09; 和json字符串之间进行互转。因为转换多数是和浏览器打交道的&#xff0c;所以一般默认的…

SpringBoot安装和创建简单的Web应用

SpringBoot安装 方式一&#xff1a; Eclipese->Help->Eclipse Marketplace ->Finde STS -> Install 注意&#xff1a;安装过程中挺慢&#xff0c;而且可能会报错&#xff0c;报错时需要重复以上步骤&#xff08;重新安装STS后&#xff0c;安装进度接之前的继续进行…

ASP.NET Session 详解

[ASP.NET] Session 详解 开发者在线 Builder.com.cn 更新时间:2008-03-23作者&#xff1a;黑暗凝聚力量&#xff0c;堕落方能自由 来源:CSDN 本文关键词&#xff1a; Web开发 ASP session 详解 本文仅代表作者个人观点&#xff0c;正确与否请读者自行研究&#xff01;阅读本文…

hadoop namenode管理元数据机制

一、简要namenode管理元数据机制&#xff1a; 二、详细namenode管理元数据机制&#xff1a; 三、secondary namenode 合并edits和fsimage&#xff1a; 四、namenode存储元数据细节&#xff1a; 五、checkpoint触发点&#xff1a; 本文转自lzf0530377451CTO博客&#xff0c;原文…

BABOK - 企业分析(Enterprise Analysis)概要

描述 企业分析描述我们如何捕捉、提炼并明晰业务需要&#xff0c;并定义一个可能实现这些业务需要的一个方案范围&#xff0c;它包括问题定义和分析&#xff0c;业务案例开发&#xff0c;可行性研究和方案范围定义 目的 明确业务战略需要和目标&#xff0c;并建议方案范围 任务…

6、EIGRP配置实验之负载均衡

1、实验拓扑 2、负载均衡原理 等价负载均衡&#xff1a;默认情况下EIGRP只支持等价负载均衡&#xff0c;默认支持4条线路的等价负载均衡&#xff0c;可以通过show ip protocols 查看&#xff0c;最大可以支持16条线路的等价负载均衡&#xff0c;可以在EIGRP路由进程下通过maxim…

haproxy+keepalived实现负载均衡及高可用

HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高性能性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。相较与 Nginx&#xff0c;HAProxy 更专注与反向代理&#xff0c;因此它可以支持更多的选项&#xff0c;更精细的控制&#xff0c;更多的健…

iOS技术博客:App备案指南

&#x1f4dd; 摘要 本文介绍了移动应用程序&#xff08;App&#xff09;备案的重要性和流程。备案是规范App开发和运营的必要手段&#xff0c;有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程&#xff0c;本文提供了一份最新、最全、最详的备…

Perl文件读写操作

本文转自 tiger506 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/tiger506/830771&#xff0c;如需转载请自行联系原作者

不用正则表达式,用javascript从零写一个模板引擎(一)

前言 模板引擎的作用就是将模板渲染成html&#xff0c;html render(template,data)&#xff0c;常见的js模板引擎有Pug,Nunjucks,Mustache等。网上一些制作模板引擎的文章大部分是用正则表达式做一些hack工作&#xff0c;看完能收获的东西很少。本文将使用编译原理那套理论来打…

关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> 因前段时间去面试&#xff0c;问到如何高效向数据库插入10万条记录&#xff0c;之前没处理过类似问题&#xff0c;也没看过相关资料&#xff0c;结果没答上来&#xff0c;今天就查了些资料&#xff0c;总结出三种方法&am…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色&#xff1a;目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色&#xff08;Target)&#xff1a;定义需要实现的目标接口 目标对象角色&#xff08;Adapter)&#xff1a;调用另外一个源对象&#xff0c;并且转换…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎&#xff0c;内存管理方案是其非常重要的模块&#xff1b; Spark的内存可以大体归为两类&#xff1a;execution和storage&#xff0c;前者包括shuffles、joins、sorts和agg…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124