拷贝

浅谈关于java中的深浅拷贝

你说的曾经没有我的故事 提交于 2020-01-14 02:48:46
一.浅拷贝(shallow copy) 1.如何实现浅拷贝? Object类 是所有类的直接或间接父类,Object中存在clone方法,如下 protected native Object clone() throws CloneNotSupportedException; 如果想要使一个类的对象能够调用clone方法 ,则需要 实现Cloneable接口, 并重写 clone方法 : public class Student implements Cloneable{ private int sno ; private String name; //getter ,setter 省略 @Override public Object clone() throws CloneNotSupportedException { Student s = null; try{ s = (Student)super.clone(); }catch (Exception e){ e.printStackTrace(); } return s; } } 现在测试clone方法: @Test public void test04() throws CloneNotSupportedException { //创建Student对象 Student s1 = new Student(); s1

JS: 对象深拷贝

▼魔方 西西 提交于 2020-01-14 02:17:38
浅拷贝:只拷贝数组或者对象的引用,无论在新的或者旧的数组或者对象中作了修改,两者都会发生变化,即两个指向的地址是同一块。 深拷贝:这种拷贝使两者分离,修改一个对象的属性,另外一个也不会有影响,即深拷贝会把所有东西重新复制一份放在另一个地方,两者指向的不是同一块地址。 1. JSON.stringify() &JSON.parse() 将JSON.stringify对象转换成字符串,然后通过JSON.parse将字符串转换成对象 var obj = {a:1, b:2, c:3}; var obj2 = JSON.parse(JSON.stringify(obj)); obj2.a = 2; console.log(obj.a); console.log(obj2.a); 上面的结果输出分别是:1和2 说明obj 和 obj2之间没有关系了,实现深拷贝 缺点:只能用于对象属性的深拷贝不能用于对象方法的拷贝 var arr = [function(){ console.log(a) }, { b: function(){ console.log(b) } }] var new_arr = JSON.parse(JSON.stringify(arr)); console.log(new_arr);  输出结果: 2. Object.assign(),可以实现对象属性和方法的深拷贝

BeanUtils 如何拷贝 List?

心不动则不痛 提交于 2020-01-13 10:37:54
BeanUtils 如何拷贝 List? 一、背景 我们在 DO 、 Model 、 VO 层数据间可能经常转换数据: Entity 对应的是持久层数据结构(一般是数据库表的映射模型); Model 对应的是业务层的数据结构; VO 就是 Controller 和客户端交互的数据结构。 例如:数据库查询出来的用户信息(表的映射模型)是 UserDO ,但是我们需要传递给客户端的是 UserVO ,这时候就需要把 UserDO 实例的属性一个一个赋值到 UserVO 实例中。 在这些数据结构之间很大一部分属性都可能会相同,也可能不同。 二、数据拷贝 2.1、数据模型 UserDO.java @Data public class UserDO { private Long userId; private String userName; private Integer age; private Integer sex; public UserDO() { } public UserDO(Long userId, String userName, Integer age, Integer sex) { this.userId = userId; this.userName = userName; this.age = age; this.sex = sex; } } UserVO

java深拷贝和浅拷贝的区别

◇◆丶佛笑我妖孽 提交于 2020-01-13 05:18:33
深拷贝和浅拷贝的区别 拷贝,一眼看过去,最简单的意思就是复制吧!浅拷贝是只拷贝一层,深层次的对象级别就只拷贝引用。 深拷贝是拷贝多层,每一级别的数据都拷贝出来。也就是说,基本数据类型其实不存在深浅拷贝的问题,只有对象和数组才存在深浅拷贝的问题。 浅拷贝 一般拷贝就是从新赋值。声明个数据直接用另外一个对象赋值。 弊端 当遇到复杂对象的时候,复制的只是对象的指针,并没有重新开辟大的空间进行复制。这时候造成的影响就是对两个指针进行数据操作的时候,操作的是同一个数据内容,相互之间是受影响! 深拷贝 需要连指针到内容都进行复制,两个指针指向两个空间的内容。各自操作已经不受影响。 方法一: 浅拷贝的复制就是直接复制赋值就可以了。 方法二: Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。 多层对象的拷贝方式 方法一 通过JSON转换 用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。但是这种方法也有不少坏处,譬如它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object

cocos2dx android SDK接入总结

元气小坏坏 提交于 2020-01-13 04:45:29
在游戏开发中,对接入三方支付SDK的总结,(此处主要以移动的支付sdk为例, 说说操作的大体步骤 或 其中遇到的一些问题。) 问题:1.三方库的拷贝问题,(如果是将*.so放在libs/armeabi下, 有可能在编译后会被NDK清除掉,所以导致找不到库的问题: 解决方法1: 通过NDK,添加android.mk文件,进行拷贝,但此处NDK的拷贝,会导致*.so内部一些符号的修改,从而会导致有些的*.so库会编译不成功(如libmegjb.so移动基地sdk)。 此方法是在jni目录中创建一个预编译文件夹prebuilt,将需要拷贝的*.so库,再创建一个Android.mk文件,指定要编译的库 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libsmsiap LOCAL_SRC_FILES := libsmsiap.so include $(PREBUILT_SHARED_LIBRARY) 再在jni下的Android.mk中添加需要编译的makefile LOCAL_SHARED_LIBRARIES := libsmsiap include $(OT_PATH)/prebuilt/Android.mk 这样就可以在每次编译后,拷贝*.so文件到libs/armeabi下 ) 解决方法2

对象的构造

夙愿已清 提交于 2020-01-13 00:27:14
从程序设计的角度,对象只是变量,因此: 在栈上创建对象时,成员变量初始值为随机值 在堆上创建对象时,成员对象初始值为随机值 在静态存储区创建对象时,成员变量初始为0值 一般而言,对象都需要一个确定的初始状态 解决方案:在类中提供一个public的initialize函数,对象创建后立即调用initialize函数进行初始化 class Test { private: int i; int j; public: void initialize(){i = 0;j = 0;} int getI(){return i;} int getJ(){return j;} }; 存在的问题 initialize只是一个普通的函数,必须显示调用 如果未调用initialize函数,运行的结果是不确定的 C++中可以定义与类名相同的特殊成员函数 这种特殊的成员函数叫做 构造函数 构造没有任何返回类型的声明 构造函数在对象定义时自动被调用 1 #include <stdio.h> 2 class Test 3 { 4 private: 5 int i; 6 int j; 7 public: 8 int getI(){ return i; } 9 int getJ(){ return j; } 10 //构造函数 11 Test() 12 { 13 i = 1; 14 j = 2; 15 } 16 };

ArrayList

懵懂的女人 提交于 2020-01-12 21:53:54
一、自动增加大小 1. 检查容量 2. 如果不够,新建一个更长的数组 3. 把老的数据,使用Arrays.copyOf方法,拷贝到新的数组 4. 引用指向新的数组 二、ArrayList使用场景 1. ArrayList的插入和删除操作,会调用System.arrayCopy()方法,拷贝数组效率低 2. 适合读数据比较多,不会频繁插入和删除的场景 3. 插入和删除操作比较频繁的情况下,使用LinkedList,因为链表不适合访问,而适合插入和删除 三、安全 1. 当做参数时,需要考虑原始的arrayList会不会改变 2. 需要把参数做一个拷贝,方法里使用这个拷贝 四、复制 1. clone()方法 2. 构造方法,把另一个ArrayList当做参数传入 3. Collection的copy方法 来源: https://www.cnblogs.com/june0816/p/6575232.html

java中的安全失败(fail-safe)机制理解

[亡魂溺海] 提交于 2020-01-12 12:41:42
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。 由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。 缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。 java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。 www.askcto.com 来源: CSDN 作者: askcto 链接: https://blog.csdn.net/askcto/article/details/103751541

零拷贝的实现原理

瘦欲@ 提交于 2020-01-12 11:40:26
场景:从一个文件中读出数据并将数据传送到另一台服务器上? File . read ( file , buf , len ) ; Socket . send ( socket , buf , len ) ; 一共涉及了4次数据拷贝: 应用程序中调用read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。 由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候,read() 调用返回,且引发一次上下文切换(内核态->用户态),现在数据已经被拷贝到了用户地址空间缓冲区,这时,如果有需要,应用程序可以操作修改这些内容。 我们最终目的是把这个文件内容通过Socket传到另一个服务中,调用Socket的send()方法,这里又涉及到一次上下文切换(用户态->内核态),同时,文件内容被进行第三次拷贝,被再次拷贝到内核地址空间缓冲区,但是这次的缓冲区与目标套接字相关联,与读取缓冲区没有半点关系。 send()调用返回,引发第四次的上下文切换,同时进行第四次的数据拷贝,通过DMA把数据从目标套接字相关的缓存区传到协议引擎进行发送。 在整个过程中,过程1和4是由DMA负责,并不会消耗CPU

对象克隆技术Object.clone()

≡放荡痞女 提交于 2020-01-12 05:47:15
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。 所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?   ⊙ 使用new操作符创建一个对象   ⊙ 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。 clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。 复制对象 or 复制引用 引用的复制   Class : 引用的复制 package com.xindatai.ibs.lime; import com.xindatai.ibs.lime.Person; public class Lime