拷贝

深入浅出理解 . 深拷贝 . 浅拷贝

给你一囗甜甜゛ 提交于 2019-11-29 05:04:35
前言 百科定义:拷贝就是拷贝指向对象的 指针 ,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成指针错误。 拷贝内容总结 数据类型与堆栈的关系 基本类型与引用类型 . 基本类型:undefined,null,Boolean,String,Number,Symbol . 引用类型:Object,Array,Date,Function,RegExp等 存储方式 . 基本类型:基本类型值在内存中占据固定大小,保存在栈内存中(不包含闭包中的变量) . 引用类型:引用类型的值是对象,保存在堆内存中。而栈内存存储的是对象的变量标识符以及对象在堆内存中的存储地址(引用),引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。 . 注意: 闭包中的变量并不保存在栈内存中,而是保存在堆内存中。这一点比较好想,如果闭包中的变量保存在了栈内存中,随着外层中的函数从调用栈中销毁,变量肯定也会被销毁,但是如果保存在了堆内存中,内存函数仍能访问外层已销毁函数中的变量。看一段对应代码理解下: function A() { let a = 'koala' function B() {

Java深拷贝与浅拷贝

帅比萌擦擦* 提交于 2019-11-29 03:15:22
一、创建对象的方式 1. new关键字,A a=new A(); 2. Constructor类的newInstance()方法,反射实现 3. Class类的newInstance()方法,内部还是调用Constructor类的newInstance()方法,反射实现 4. clone()方法,复制对象产生一个新对象 5. 序列化反序列化 二、引用拷贝 vs 对象拷贝 A a1=new A(); A a2=a1; // a2和a1是同一个对象,内存地址相同,即引用相同 三、浅拷贝:值类型拷贝值,引用类型只拷贝了引用而不拷贝引用的对象,拷贝出来的对象和原对象共用引用 1. 当前类实现Cloneable接口 2. 引用类型使用的还是同一个引用 四、深拷贝:值类型和引用类型都复制,拷贝出来的对象和原对象相互独立 1. 除了类本身要实现Cloneable接口,类中的其他引用类也要实现Cloneable接口,比较麻烦 2. 对a1序列化,反序列化到a2,可以实现深拷贝 参考: https://www.cnblogs.com/ysocean/p/8482979.html 来源: https://www.cnblogs.com/june0816/p/11421457.html

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

烂漫一生 提交于 2019-11-29 01:47:07
前言 想写好前端,先练好内功。 栈内存与堆内存 、浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 栈 定义 后进者先出,先进者后出,简称 后进先出 (LIFO),这就是典型的 栈 结构。 新添加的或待删除的元素都保存在栈的末尾,称作 栈顶 ,另一端就叫 栈底 。 在栈里,新元素都靠近栈顶,旧元素都接近栈底。 从栈的操作特性来看,是一种 操作受限 的线性表,只允许在一端插入和删除数据。 不包含任何元素的栈称为 空栈 。 栈也被用在编程语言的编译器和内存中保存变量、方法调用等,比如函数的调用栈。 堆 定义 堆数据结构是一种树状结构。 它的存取数据的方式,与书架与书非常相似。我们不关心书的放置顺序是怎样的,只需知道书的名字就可以取出我们想要的书了。 好比在 JSON 格式的数据中,我们存储的 key-value 是可以无序的,只要知道 key,就能取出这个 key 对应的 value。 堆与栈比较 堆是动态分配内存,内存大小不一,也不会自动释放。 栈是自动分配相对固定大小的内存空间,并由系统自动释放。 栈,线性结构,后进先出,便于管理。 堆,一个混沌,杂乱无章,方便存储和开辟内存空间。 栈内存与堆内存 JavaScript

使用Shell远程给Linux安装JDK

ぐ巨炮叔叔 提交于 2019-11-29 01:14:20
使用Shell远程给Linux安装JDK #1.下载JDK (不同版本JDK更换链接即可) wget命令下载的文件会在当前目录下,所以如果在下载前最好先 cd 到想把JDK安装的位置,如果没有,可以先创建相应目录 1 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz #2.安装JDK 1 2 3 4 5 <!-- 解压文件即可 --> tar -zxvf jdk-8u60-linux-x64.tar.gz <!-- 如果需要拷贝文件,下变为相应拷贝命令,不需要拷贝,忽略下边那内容 --> cp -r jdk1.8.0_60/ /usr/lib/jvm/jdk1.8.0_60/ #3.配置环境变量 3.1在/etc/profile文件中加入下边配置 最主要的是 JAVA_HOME 的配置 1 2 3 export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_60/ export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA

多重继承

吃可爱长大的小学妹 提交于 2019-11-29 00:07:50
在派生类的派生列表中可以包含多个基类: class Bear : public ZooAnimal { /* ... */ }; class Panda : public Bear, public Endangered { /* ... */ }; 每个基类包含一个可选的访问修饰符。一如往常,如果访问说明符被忽略了,则关键字class对应的默认访问说明符是private,关键字struct对应的是public。   和只有一个基类继承一样,多重继承的派生列表也只能包含已经被定义过的类,而且这些类只能是final的。对于派生类能够继承的基类个数,C++没有进行特殊的规定;但是在某个给定的派生类表中,同一个基类只能出现一次。 多重继承的派生类从每个基类中继承状态   在多重继承关系中,派生类的对象含有每个基类的子对象。 派生类构造函数初始化所有基类   构造一个派生类对象将同时构造并初始化它的所有基类子对象。与从一个基类进行派生一样,多重继承的派生类的构造函数初始值也只能初始化它的直接基类。 //显示地初始化所有基类 Panda::Panda(std::string name, bool onExhibit) : Bear(name, onExhibit, "Panda"), Endangered(Endangered::critical) {} /

细说 Java 的深拷贝和浅拷贝

萝らか妹 提交于 2019-11-28 23:06:29
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。 未经允许,不得转载。 一、前言 任何变成语言中,其实都有浅拷贝和深拷贝的概念,Java 中也不例外。在对一个现有的对象进行拷贝操作的时候,是有浅拷贝和深拷贝之分的,他们在实际使用中,区别很大,如果对其进行混淆,可能会引发一些难以排查的问题。 本文就在 Java 中的深拷贝和浅拷贝做一个详细的解说。 二、什么是浅拷贝和深拷贝 首先需要明白,浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。 在 Java 中,除了 基本数据类型 (元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。 而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。 所以到现在,就应该了解了,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。 总结来说

js深拷贝和浅拷贝

断了今生、忘了曾经 提交于 2019-11-28 23:06:02
一、数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。 var arr = ["One","Two","Three"]; var arrto = arr; arrto[1] = "test"; document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Three document.writeln("数组的新值:" + arrto + "<br />");//Export:数组的新值:One,test,Three 像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗? 方法一:js的slice函数 对于array对象的slice函数, 返回一个数组的一段。(仍为数组) arrayObj.slice(start, [end]) 参数 arrayObj 必选项。一个 Array 对象。 start 必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。 end 可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。 说明 slice 方法返回一个

Java 浅拷贝和深拷贝

大城市里の小女人 提交于 2019-11-28 23:05:41
一看就懂的,java深拷贝浅拷贝 将一个对象的引用复制给另外一个对象,一共有三种方式。第一种方式是 直接赋值 ,第二种方式是 浅拷贝, 第三种是 深拷贝。 所以大家知道了哈,这三种概念实际上都是为了拷贝对象啊。 1、直接赋值 好,下面我们先看第一种方式,直接赋值。在Java中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是同一个对象。因此,当a1变化的时候,a2里面的成员变量也会跟着变化。各位,请看下面的代码吧! /* 建立类 */ class Resume { private String name; //姓名 private String sex; //性别 private int age; //年龄 private String experience; //工作经历 public Resume(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setExperience(String experience) { this

Java的深拷贝和浅拷贝

北城余情 提交于 2019-11-28 23:05:15
  关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。 1、创建对象的5种方式    ①、通过 new 关键字   这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object();    ②、通过 Class 类的 newInstance() 方法   这种默认是调用类的无参构造方法创建对象。比如 Person p2 = (Person) Class.forName("com.ys.test.Person").newInstance();    ③、通过 Constructor 类的 newInstance 方法   这和第二种方法类时,都是通过反射来实现。通过 java.lang.relect.Constructor 类的 newInstance() 方法指定某个构造器来创建对象。   Person p3 = (Person) Person.class.getConstructors()[0].newInstance();   实际上第二种方法利用 Class 的 newInstance() 方法创建对象,其内部调用还是