千家信息网

java的deep vs shallow copies怎么理解

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"java的deep vs shallow copies怎么理解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"java的deep vs s
千家信息网最后更新 2026年11月01日java的deep vs shallow copies怎么理解

本篇内容主要讲解"java的deep vs shallow copies怎么理解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"java的deep vs shallow copies怎么理解"吧!

1.背景

讨论 deep copy and shallow copy时,需要明白一点,肯定不是基本数据类型也不是 String,因为它们都是不可变的,都是值传递。换句话说,当讨论 deep copy or shallow copy时,都针对的引用类型,在讨论的是引用如何传递

2.根本区别

看引用是否指向同一个对象


shallow copydeep copy
区别引用指向同一个对象引用执行不同的对象
特征修改其中一个对象会影响另一个对象修改其中一个对象不会影响另一个对象

3.例子

先定义 person 类,重写 hashCode 方法( 至于为什么重写 HashCode,参考 HashCode)

/** * @author shengjk1 * @date 2019/9/24 */public class Person implements Serializable {         private static final long serialVersionUID = 5866287941609270803L;private int age;private String name;private int grade;public int getAge() {         return age;}public void setAge(int age) {         this.age = age;}public String getName() {         return name;}public void setName(String name) {         this.name = name;}public int getGrade() {         return grade;}public void setGrade(int grade) {         this.grade = grade;}static void run() {                         System.out.println("run....");}@Overridepublic boolean equals(Object o) {         if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;                Person person = (Person) o;return getAge() == person.getAge() && getGrade() == person.getGrade() && Objects.equals(getName(), person.getName());}@Overridepublic int hashCode() {         return Objects.hash(getAge(), getName(), getGrade());}@Overridepublic String toString() {         return "Person{" +"age=" + age +", name='" + name + '\'' +", grade=" + grade +'}';}}

主方法

HashMap map = new HashMap<>();                Person person = new Person();                person.setAge(1);                person.setName("a");                person.setGrade(1);                map.put("a",person);                System.out.println("map============");                System.out.println("修改前 " + map.get("a"));                person.setName("aa");                System.out.println("修改后 " + map.get("a"));
map============修改前 Person{age=1, name='a', grade=1}修改后 Person{age=1, name='aa', grade=1}

命名修改的 person 中的属性,为什么map 中的person 也改变了呢?

无论是局部变量 person 还是 map 实际上都引用了同一份 Person 对象。故而当 Person 对象中的某些属性发生改变时,局部变量 person 和 map 都是可以感知到的。
那么如何才能不"相互干扰"呢,只要它们引用的对象不一致即可。

4.实现 deep copy

目前( jdk8 ) java 本身没有支持 deep copy 的实现。我们可以自己实现

  1. 重写 clone 方法,太复杂

  2. 序列化反序列化 简单
    apache common lang 已经实现了

HashMap deelClone = SerializationUtils.clone(map);                person.setName("b");                System.out.println("deelClone.get(\"a\") = " + deelClone.get("a"));                System.out.println("map.get(\"a\") = " + map.get("a"));
deelClone.get("a") = Person{age=1, name='aa', grade=1}map.get("a") = Person{age=1, name='b', grade=1}

deep clone 之后,person name 并未发生变化

到此,相信大家对"java的deep vs shallow copies怎么理解"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

对象 方法 内容 变量 实际 局部 属性 序列 指向 类型 学习 影响 不同 复杂 实用 更深 一致 例子 兴趣 实用性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 江苏根荣互联网科技 科技互联网政务服务 九亚互联网科技 融势互联网科技 互联网金融监管科技 顺网科技2021年互联网排名 济南和联互联网科技有限公司 汽车互联网创新科技园 宝灵互联网科技有限公司 荆州市昕露互联网络科技有限公司 黑科技闪耀互联网之光 玉溪互联网科技怎么选 互联网企业科技类企业如何做账 互联网科技股为什么大涨 互联网时代科技型公司的机会 米泉互联网科技专业怎么样 深圳互联网科技园地址 山东亿川互联网科技有限责任公司 科技发展第三阶段互联网时代 互联网公司 科技公司 猫创互联网科技 互联网前沿科技 中正互联网科技招聘 受益于互联网科技的高速发展 知域互联网科技有限公司大骗子 搜狐科技互联网 山东子淼互联网科技有限公司 互联网金融科技元年 互联网科技手抄报图片
0