Java之深浅拷贝

基本类型:拷贝数据的值

其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权限影响

String类型:拷贝的也是一个引用,但其内容存储在字符串池中,修改时会重新生成新的字符串,原有字符串内容是保持不变的(String是不可变的),等同于基本类型。

浅拷贝

浅拷贝就是直接使用"="给基本类型赋值(即使拷贝引用)

List srcList = new ArrayList<>();

srcList.add("android");

List cpyList = srcList;

srcList.add("ios");

输出这两个list,srcList和cpyList都有android,ios两项。

深拷贝

深拷贝就是将所有属性均拷贝到另外一个对象中,将其中任何一个对象的任何一个属性发生变化时,另外一个对象不受任何影响。

List srcList = new ArrayList<>();

srcList.add("android");

List cpyList = new ArrayList<>(srcList);

srcList.add("ios");

输出这两个list,srcList有android,ios两项,而cpyList只有android一项。

clone方法实现拷贝

每个对象都是继承于Object类的,Object类提供了clone方法,通过实现Cloneable接口可以使该具有拷贝的能力,拷贝的操作是在内存中进行中,所以性能会比直接构造对象要快速很多。

public class Student implements Cloneable {

private String name;

private Teacher teacher;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Teacher getTeacher() {

return teacher;

}

public void setTeacher(Teacher teacher) {

this.teacher = teacher;

}

@Override

protected Student clone() {

Student s = null;

try {

s = (Student) super.clone();

s.setTeacher(s.getTeacher());

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return s;

}

public static void main(String[] args) {

Student s1 = new Student();

s1.setName("Yao");

s1.setTeacher(new Teacher("Kobe"));

Student s2 = s1.clone();

s2.setName("Yi");

s2.getTeacher().setName("Jordan");

System.out.println(s1.getName() + "'s teacher is "

+ s1.getTeacher().getName());

System.out.println(s2.getName() + "'s teacher is "

+ s2.getTeacher().getName());

}

}

class Teacher {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Teacher(String name) {

super();

this.name = name;

}

}

输出:

Yao's teacher is Jordan

Yi's teacher is Jordan

这里关于teacher的拷贝是通过"="号来操作的,仅仅实现了浅拷贝。

@Override

protected Student clone() {

Student s = null;

try {

s = (Student) super.clone();

s.setTeacher(new Teacher(s.getTeacher().getName()));

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return s;

}

将Student类的clone方法改成这样即可实现深拷贝。

输出:

Yao's teacher is Kobe

Yi's teacher is Jordan

通过对象序列化,使用writeObject和readObject也可以实现对象的深拷贝。

java set拷贝_Java之深浅拷贝相关推荐

  1. java的深浅拷贝_Java中深浅拷贝

    一,浅拷贝 ①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象.因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得 ...

  2. 关于Java中的HashMap的深浅拷贝的测试与几点思考

    0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...

  3. 【C++grammar】析构、友元、拷贝构造函数、深浅拷贝

    目录 1.Destructor(析构函数) 在堆和栈(函数作用域与内嵌作用域)上分别创建Employee对象,观察析构函数的行为 2.Friend(友元) 1.为何需要友元 2.友元函数和友元类 3. ...

  4. php深浅拷贝,js实现深浅拷贝方法

    说起深浅拷贝,我觉得需要理清楚 值类型 和 引用类型,本文主要和大家分享js实现深浅拷贝方法,希望能帮助到大家. 值类型 所谓 值类型 就是 undefined,null,number, string ...

  5. java 包含文件_java 文件夹拷贝(文件夹里包含文件和文件夹) 代码

    java代码实现文件夹拷贝,文件夹可能包含文件夹和文件import java.io.BufferedReader; import java.io.File; import java.io.FileIn ...

  6. java文件拷贝_Java实现文件拷贝的4种方法

    第一种方法:古老的方式 public static long forJava(File f1,File f2) throws Exception{ long time=new Date().getTi ...

  7. Java中深浅拷贝之List

    List的浅拷贝 浅拷贝将引用复制.指向的是同一个地址,改变A和B中的任何一个,另一个都会随之发生变化. List浅拷贝(针对List里 装的是对象-----"引用"[基础类型不分 ...

  8. 是时候捋一捋Java的深浅拷贝了

    在开发.刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝.拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的! 在对象的拷贝中,很多初学者可能搞不清到 ...

  9. 5张图搞懂Java深浅拷贝

    微信搜一搜 「bigsai」 关注这个专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 欢迎star收藏 如果本篇对你有帮助,记得点赞收藏哦! 在开发.刷 ...

  10. 大剑无锋之Java的深浅拷贝解释一下!

    拷贝的一个经典的使用场景:当前对象要传给其他多个方法使用,如果该对象在某一个方法中被修改,那么这个修改会影响到其他方法. 如果要避免这种影响,就需要给每一个方法都传入一个当前对象的拷贝. 深与浅拷贝的 ...

最新文章

  1. ASP.NET XML Web 服务的工作流解决方案
  2. movavi video suite2020中文版
  3. OO实现ALV TABLE 九:ALV的事件
  4. Mysql学习总结(10)——MySql触发器使用讲解
  5. 第4课第4节_Android灯光系统_源码分析_电池灯
  6. 1个多月就能看到效果的减肥大法 - 健康程序员,至尚生活!
  7. Redis安装[Windows]
  8. 最近幻影的两个ARP欺骗工具 挺不错的
  9. Python接通图灵机器人
  10. python工资这么高为什么不学-为什么我不建议你学Python?
  11. mac matlab 模糊,MATLAB 2014a 在Mac OS X yosemite 10.10 Retina显示模糊的解决办法
  12. matlab海洋数值模拟,海洋数值模拟课程教学大纲.PDF
  13. ICPC-Tic Tac Toe
  14. python3,烤地瓜案例
  15. Django笔记教程:三、Model进阶
  16. JVM--插入式注解处理器
  17. python工具方法 10 h5py批量写入文件、读取文件,支持任意维度的数据
  18. PPT做起来老大难?试试这5个神器网站
  19. HBase项目实战:HBase+Flume+Kafka+Hive+SSM实现电信大数据通话信息实时读写定位系统
  20. python学习——酷炫时钟

热门文章

  1. 携程2019秋招面经
  2. apple id两步验证服务器,【安全可靠】Apple ID 两步验证支持中国地区 - 爱应用
  3. 阿里云服务器价格表,1核2G、2核4G、4核8G爆款配置收费标准
  4. 3w+字,Python办公自动化之Excel报表自动化,看这一篇就够了!
  5. 传统数据处理技术如何与大数据处理技术有机结合
  6. 2021-10-26 Ubantu练习打字的小游戏
  7. 林彪-怎样当好一名师长
  8. 加了尾注怎么添加新页_wps添加有尾注,随后删掉之后空白页怎么也不删掉?求大神帮忙...
  9. 古风系统仙侠文推荐_5本古典仙侠全本精品小说,文笔精湛,仙味十足,值得细品一二...
  10. linux程序cat本地文本文件,linux – 这里有cat的文件