您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“java的deep vs shallow copies怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“java的deep vs shallow copies怎么理解”吧!
討論 deep copy and shallow copy
時(shí),需要明白一點(diǎn),肯定不是基本數(shù)據(jù)類型也不是 String,因?yàn)樗鼈兌际遣豢勺兊?,都?code>值傳遞。換句話說,當(dāng)討論 deep copy or shallow copy
時(shí),都針對的引用類型,在討論的是引用如何傳遞
看引用是否指向同一個(gè)對象
shallow copy | deep copy | |
---|---|---|
區(qū)別 | 引用指向同一個(gè)對象 | 引用執(zhí)行不同的對象 |
特征 | 修改其中一個(gè)對象會影響另一個(gè)對象 | 修改其中一個(gè)對象不會影響另一個(gè)對象 |
先定義 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 也改變了呢?
無論是局部變量 person 還是 map 實(shí)際上都引用了同一份 Person 對象。故而當(dāng) Person 對象中的某些屬性發(fā)生改變時(shí),局部變量 person 和 map 都是可以感知到的。
那么如何才能不”相互干擾“呢,只要它們引用的對象不一致即可。
目前( jdk8 ) java 本身沒有支持 deep copy 的實(shí)現(xiàn)。我們可以自己實(shí)現(xiàn)
重寫 clone 方法,太復(fù)雜
序列化反序列化 簡單
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í)!
免責(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)容。