前端深拷贝的三种实现方式 ,Java实现深拷贝

本文目录

Java实现深拷贝


下面给你简单介绍protected 域(或方法)实现过程思路:


protected 域(或方法)对本包内的所有类可见(当然包括子类),那么,子类可以获得访超类受保护域(或方法)的权利,但是,若子类和超类不在同一个包下,就不能访问超类对象的这个受保护域(或方法)。


浅拷贝与深拷贝


Object类对自己的具体子类的域一无所知,Object类的clone方法只是将各个域进行拷贝。数值或基本类型不会出现问题,但是,如果在对象中包含了引用对象,这些对象的内容没有被自我复制,拷贝的结果也即是原始对象和拷贝对象引用着同一个引用对象(一般地,动词“引用”可理解为“管理”,就是指向同一内存)。


浅拷贝满足:


x.clone() != x为 true,


x.clone().getClass() == x.getClass()为true,


((x.clone().field1 ) == (x. field1))&& … &&((x.clone().fieldN )==(x. fieldN))也为 true 。


如果原始对象与浅拷贝对象共同引用(管理、指向)的引用对象是不可变的,将不会产生任何问题


如果原始对象管理的引用对象是可变的,就必须需重新定义clone方法,来实现深层次的拷贝。要对涉及的每一个类,判断以下两点:


默认的clone方法是否满足需求。


默认的clone方法是否能通过调用可变引用对象的clone方法得到解决。


对涉及的每一个类,深拷贝要满足:


x.clone() != x为 true,


x.clone().getClass() == x.getClass()为true,


x.clone().equals(x)也为 true ,当然equals方法是如此重写过的。 


Object类中的clone方法被声明为protected,防止出现文章开头所提到的,子类和超类不在同一个包下的情况,要声明clone为public,来实现深拷贝


前端深拷贝的三种实现方式
,Java实现深拷贝图1

208WEB前端Javascript里的深浅拷贝


Javascript有五种基本数据类型(也就是简单数据类型),它们分别是:Undefined,Null,Boolean,Number和String。还含有一种复杂数据类型,就是对象
注意Undefined和Null的区别,Undefined类型只有一个值,就是undefined,Null类型也只有一个值,也就是null
Undefined其实就是已声明未赋值的变量输出的结果
null其实就是一个不存在的对象的结果
var c;console.log(c)//undefinedconsole.log(document.getElementById('wsscat'))//没有id为wsscat的节点,输出null1234
简单的数据类型和复杂的数据类型有以下重要的区别
对于简单数据类型
它们值在占据了内存中固定大小的空间,并被保存在栈内存中。当一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本,还有就是不能给基本数据类型的值添加属性
var a = 1;var b = a;
a.attr = 'wsscat';console.log(a.attr)//undefined
上面代码中a就是简单数据类型(Number),b就是a的副本,它们两者都占有不同位置但相等的内存空间
对于复杂的数据类型
复杂的数据类型即引用类型,它的值是对象,保存在堆内存中,包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。
var obj = {
name:'wsscat',
age:0
} var obj2 = obj;
obj2['c'] = 5;
console.log(obj);//Object {name: "wsscat", age: 0, c: 5}
console.log(obj2);////Object {name: "wsscat", age: 0, c: 5}
我们可以看到obj赋值给obj2后,当我们更改其中一个对象的属性值,两个对象都发生了改变,究其原因局势因为obj和obj2这两个变量都指向同一个指针,赋值只是复制了指针,所以当我们改变其中一个的值就会影响另外一个变量的值
浅拷贝
其实这段代码就是浅拷贝,有时候我们只是想备份数组,但是只是简单让它赋给一个变量,改变其中一个,另外一个就紧跟着改变,但很多时候这不是我们想要的
var obj = {
name:'wsscat',
age:0
} var obj2 = obj;
obj2['c'] = 5;
console.log(obj);//Object {name: "wsscat", age: 0, c: 5}
console.log(obj2);////Object {name: "wsscat", age: 0, c: 5}
深拷贝
数组
对于数组我们可以使用slice()和concat()方法来解决上面的问题
silce
var arr = ['wsscat', 'autumns', 'winds']; var arrCopy = arr.slice(0);
arrCopy[0] = 'tacssw'
console.log(arr)//['wsscat', 'autumns', 'winds'] console.log(arrCopy)//['tacssw', 'autumns', 'winds']
concat
var arr = ['wsscat', 'autumns', 'winds']; var arrCopy = arr.concat();
arrCopy[0] = 'tacssw'
console.log(arr)//['wsscat', 'autumns', 'winds'] console.log(arrCopy)//['tacssw', 'autumns', 'winds']
对象
对象我们可以定义一个新的对象并遍历新的属性上去实现深拷贝
var obj = { name:'wsscat', age:0
} var obj2 = new Object();
obj2.name = obj.name;
obj2.age = obj.age
obj.name = 'autumns'; console.log(obj);//Object {name: "autumns", age: 0} console.log(obj2);//Object {name: "wsscat", age: 0}
当然我们可以封装好一个方法来处理对象的深拷贝,代码如下
var obj = {
name: 'wsscat',
age: 0
} var deepCopy = function(source) {
var result = {}; for(var key in source) { if(typeof source[key] === 'object') {
result[key] = deepCopy(source[key])
} else {
result[key] = source[key]
}
} return result;
} var obj3 = deepCopy(obj)
obj.name = 'autumns';
console.log(obj);//Object {name: "autumns", age: 0}
console.log(obj3);//Object {name: "wsscat", age: 0}

前端深拷贝的三种实现方式
,Java实现深拷贝图2

前端和后端的区别


深拷贝是针对这种引用类型的数据结构而言的,
引用类型的特点呢,就是你修改它所有引用的位置都会受到影响,
当你不希望有这种影响的时候,你就要用深拷贝。

前端深拷贝的三种实现方式
,Java实现深拷贝图3

浅拷贝和深拷贝的区别js常见笔试题


浅拷贝只是拷贝了引用, 数据在内存中还是一个, 如果引用的对象发生了变化, 该变量也会同步变化.


深拷贝相当于把内存上的数据拷贝了一份, 此时修改该变量不会影响原来的变量, 同理修改原来的变量也不会影响现在的变量.


浅拷贝:


const foo = { bar: 'bar', baz: 'baz' }
const ref_foo = foo

深拷贝(最简单的方法, 拷贝性能也不弱):


const foo = { bar: 'bar', baz: 'baz' }
const ano_foo = JSON.parse(JSON.stringify(foo))

前端深拷贝的三种实现方式
,Java实现深拷贝图4

以上就是关于前端深拷贝的三种实现方式 ,Java实现深拷贝的全部内容,以及前端深拷贝的三种实现方式 的相关内容,希望能够帮到您。

上一篇 2022年07月03日14时40分05秒
下一篇 2022年07月03日14时49分46秒

相关推荐

  • 中国见面礼仪英语作文 ,向外国笔友介绍中国餐桌礼仪英语作文带翻译

    本文目录 1.向外国笔友介绍中国餐桌礼仪英语作文带翻译 2.高分中国见面时的问候方式、对赞美的回答方式、接收礼物的回映方式、餐宴礼节这些内容写篇英语作文 3.介绍中国谈话礼节的英语作文带翻译 4.用英语介绍中国的见面礼仪 向外国笔友介绍中国餐桌礼仪英语作文带翻译 China Dining Custom Table Manners The main difference between Chinese and western eating habits is that unlike the West, where everyone has their own plate of food, in …

    2022年11月25日
    16
  • 你准备下班了英语 ,下班用英文怎么表达

    本文目录 1.下班用英文怎么表达 2.我快下班了用英语怎么说 3.准备下班英文怎么写 4.快要下班了 简介常用的翻译句子 下班用英文怎么表达 下班了的英文: off duty duty 读法 英 ['djuːtɪ] 美 ['duːtɪ] n(名词). 责任;关税;职务 短语 1、Duty Room 值班室 ; 值日室 ; 医生值班室 2、duty free 免税 ; 免费的责任 3、excise duty 消费税 ; 国内消费税 4、high duty 高关税 ; 高性能的 ; 重型的 ; 高能率的 5、duty ratio 占空比 ; 占空因数 扩展资料 词语用法 duty表示“职责”时,是…

    2022年11月25日
    16
  • sploosh怎么发音 ,Sugar 是什么意思 怎么读

    本文目录 1. 2.sugar怎么读 3.如何用英语发音查单词 sugar怎么读 一、sugar读法: 1、英 [ˈʃʊɡə(r)] 美 [ˈʃʊɡər] 2、n. 糖;食糖;甜言蜜语 3、vt. 加糖于;粉饰 4、vi. 形成糖 5、n. (Sugar)人名;(英)休格 二、短语 1、reducing sugar [有化] 还原糖 ; 还原糖 ; 个以上的单糖通过糖苷键连接形成的聚合物 ; 复原糖 2、Rock Sugar 冰糖 ; 芝麻 ; 烧海苔 ; 翻译 3、Icing Sugar糖粉 ; 糖霜 ; 糖份混合物 ; 糖 4、Sugar glider 蜜袋鼯 ; 澳洲飞袋鼠 ; 飞天鼠 …

    2022年11月25日
    16
  • 什么叫双重否定反问句 ,双重否定句是什么意思举个例子说明

    本文目录 1.双重否定句是什么意思举个例子说明 2.反问句改双重否定句的方法和技巧 3.什么是双重否定句和反问句哪个语气更强烈 4.双重否定句是什么意思 双重否定句是什么意思举个例子说明   在学习语文的时候我们会接触到双重否定句,虽说有否定这两个词,但是它表达的意思却是与之相反的,这是为什么呢?我们赶紧一起来了解一下吧。   双重否定句是什么意思   双重否定句是一种句式,即否定两次,表示肯定的意思,双重否定句语气比肯定句更为强烈,加强了肯定的效果。   1、双重否定句是相对于单纯否定句而言的,它用否定加否定的形式表达肯定的语意,一般的语法书普遍认为,双重否定句的作用是加强语气。   2、双…

    2022年11月25日
    16
  • 一般疑问句复数形式 ,英语一般疑问句否定句变化规则

    本文目录 1.英语一般疑问句否定句变化规则 2.一般疑问句一般将来时一般现在时现在进行时肯否定回答否定句复数句的构成和用法 3.一般疑问句单数和复数怎么写 4.特殊疑问句里面名词可以是复数和一般疑问句吗 英语一般疑问句否定句变化规则 一般疑问句:系动词(am、is、are)+主语+表语 特殊疑问句:What/who/which等疑问代词或疑问副词+助动词(do、does)+主语+宾语 否定句:主语+动词+not+表语或宾语 肯定回答:Yes,主语/代词+动词 否定回答:No,主语/代词+动词+not(如果问句是否定疑问句,则肯定回答和否定回答调换) 变复数:名词后+s 遇到s、sh、ch结尾的…

    2022年11月25日
    16
  • 乌克兰主要城市英语名称 ,乌克兰主要城市有哪些

    本文目录 1.乌克兰主要城市有哪些 2.加拿大的主要城市英文名 3.加拿大的首都英文名是什么 4.乌克兰的首都是哪里 乌克兰主要城市有哪些 乌克兰主要城市如下: 1、首都基辅,比较繁华,政治经济文化中心。 2、第二大城市哈尔科夫,紧邻俄罗斯,军工业发达,著名的t80坦克的发源地,拥有数所著名大学。 3、最大港口敖德萨,濒临黑海,货运发达,华人极多。 4、旅游胜地克里木,也是历史文化圣地,二战后美英苏瓜分世界的著名的雅尔塔会议就在那里举行,咱中国的第一艘航母瓦良格号,就是在那里的黑海造船厂建造的。 区域位置 乌克兰位于欧洲东部,黑海、亚速海北岸。北邻白俄罗斯,东北接俄罗斯,西连波兰、斯洛伐克、匈…

    2022年11月25日
    16
  • time每个字母代表单词 ,把TIME这个单词的四个字母作为开头分别组成四个不同的词用这四个词...

    本文目录 1.个英语单词8个字母开头是time 意思要好听一点的 2.time to go to怎么读 3.把TIME这个单词的四个字母作为开头分别组成四个不同的词用这四个词解释TIME的意 4.关于时间的英语单词 个英语单词8个字母开头是time 意思要好听一点的 Timecard Timeless Timelier Timeline Timeouts Timework Timeworn 只有这7 个单词. 最好含义的是 timeless (永恒) time to go to怎么读 time / taim / 汉语:时间,单词构成是由:辅音字母 t + 元音字母 i + 辅音字母m + 不发…

    英语知识 2022年11月25日
    11
  • favourite特别喜爱的怎么读 ,favourite的发音

    本文目录 1.favourite的发音 2.favourite最喜爱的怎么读 3. 4.“favourite”的读音是什么 favourite的发音 favourite 英式发音:['feɪv(ə)rɪt] 美式发音:['fevərɪt] 中文谐音:飞沃儿瑞特 adj. 特别受喜爱的 n. 特别喜爱的人(或物) [例句]Apples and melons are my favourite fruits. 苹果和甜瓜是我喜爱的水果。 favourite最喜爱的怎么读 “favourite”的读音为:英 [ˈfeɪvərɪt]、美 [ˈfeɪvərɪt] 。表达意思:特别受喜爱的;特别喜爱的人(或…

    2022年11月25日
    16