溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java的deep vs shallow copies怎么理解

發(fā)布時(shí)間:2021-11-24 14:19:27 來源:億速云 閱讀:117 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“java的deep vs shallow copies怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“java的deep vs shallow copies怎么理解”吧!

1.背景

討論 deep copy and shallow copy時(shí),需要明白一點(diǎn),肯定不是基本數(shù)據(jù)類型也不是 String,因?yàn)樗鼈兌际遣豢勺兊?,都?code>值傳遞。換句話說,當(dāng)討論 deep copy or shallow copy時(shí),都針對的引用類型,在討論的是引用如何傳遞

2.根本區(qū)別

看引用是否指向同一個(gè)對象


shallow copydeep copy
區(qū)別引用指向同一個(gè)對象引用執(zhí)行不同的對象
特征修改其中一個(gè)對象會影響另一個(gè)對象修改其中一個(gè)對象不會影響另一個(gè)對象

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<String, Person> 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 也改變了呢?
java的deep vs shallow copies怎么理解

無論是局部變量 person 還是 map 實(shí)際上都引用了同一份 Person 對象。故而當(dāng) Person 對象中的某些屬性發(fā)生改變時(shí),局部變量 person 和 map 都是可以感知到的。
那么如何才能不”相互干擾“呢,只要它們引用的對象不一致即可。

4.實(shí)現(xiàn) deep copy

目前( jdk8 ) java 本身沒有支持 deep copy 的實(shí)現(xiàn)。我們可以自己實(shí)現(xiàn)

  1. 重寫 clone 方法,太復(fù)雜

  2. 序列化反序列化 簡單
    apache common lang 已經(jīng)實(shí)現(xiàn)了

HashMap<String, Person> 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 并未發(fā)生變化

到此,相信大家對“java的deep vs shallow copies怎么理解”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI