老师我有问题

来源:7-4 请实现对象浅复制与深复制

qq_粽翎_0

2020-03-19 23:14:45

package com.imooc.basis;

import lombok.Data;

import java.io.*;

@Data
public class TwoWaysToCopy implements Cloneable, Serializable {
    private TwoWaysToCopy reference;

    private TwoWaysToCopy deepCopy() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (TwoWaysToCopy)ois.readObject();
    }

    public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
        TwoWaysToCopy original = new TwoWaysToCopy();
        TwoWaysToCopy reference = new TwoWaysToCopy();
        original.setReference(reference);
        System.out.println("原始类的哈希值:" + original.hashCode());
        System.out.println("原始类下引用属性的哈希值:" + original.getReference().hashCode());

        //潜复制
        TwoWaysToCopy shallow = (TwoWaysToCopy)original.clone();
        System.out.println("潜复制类的哈希值:" + shallow.hashCode());
        System.out.println("潜复制类下引用属性的哈希值:" + shallow.getReference().hashCode());

        //深复制
        TwoWaysToCopy deep = original.deepCopy();
        System.out.println("深复制类的哈希值:" + deep.hashCode());
        System.out.println("深复制类下引用属性的哈希值:" + deep.getReference().hashCode());
    }
}
原始类的哈希值:161
原始类下引用属性的哈希值:102
潜复制类的哈希值:161
潜复制类下引用属性的哈希值:102
深复制类的哈希值:161
深复制类下引用属性的哈希值:102

为何我的执行结果是这样的,老师能帮忙看下吗,谢谢

写回答

2回答

好帮手慕阿莹

2020-03-20

同学你好

你可以这样理解,无论是深复制还是浅复制,都是把这个对象的属性复制到另外一个相同类型的对象去。

首先是相同类型的对象本身就是一个新对象。所以地址值会不同。

而浅复制就是把你里边属性的引用也拷贝到这个新的对象中。

而深复制就是你把里边的属性也新创建了一个和你一样的一个新对象。

比如说,

你有一本书,你朋友也想要一本一样的,你给他复印了一本。

首先他的那本和你的那本肯定不是同一本,但里边的内容都来自于你里边的内容。

深复制就好比是你又重新给他买了一本。 

首先他的那本和你的那本肯定不是同一本,而且里边的内容虽然一样,但终究不是来自你那一本。

这个只是老师通俗的理解。可能不是很恰当。希望能帮助同学理解。

如果还是不理解,这里建议同学可以先记忆一下。

如果我的回答解决了你的问题,请采纳,祝学习愉快.


0
hq_粽翎_0
h 形象生动,可以了,谢谢老师
h020-03-20
共1条回复

qq_粽翎_0

提问者

2020-03-20

哦好像是lombok重写了hashcode方法的缘故,我换成getter和setter就可以了

原始类的哈希值:2133927002
原始类下引用属性的哈希值:1836019240
浅复制类的哈希值:325040804
浅复制类下引用属性的哈希值:1836019240
深复制类的哈希值:1329552164
深复制类下引用属性的哈希值:363771819

想知道引用属性浅复制时哈希值为何没变化,而原本的类哈希值一直在变,无论浅复制还是深复制

0

0 学习 · 8263 问题

查看课程