栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅拷贝和深拷贝

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅拷贝和深拷贝

        对象创建完之后是放在堆里面的,每一个线程有一个栈(比如启动一个main函数这就是一个主线程,每个线程都有自己的栈),栈里面存在的是对这个对象的引用。很多时候 = null其实意思就是说他的引用为空,就是没有指向任何东西。

浅拷贝:

        创建一个A对象和一个B对象,如果简简单单的 A=B 其实就是将B对堆里面某个对象的引用复制给了A,你对A引用的对象进行修改,你会发现B引用的对象也被修改了,这就说明他们两个引用的是同一个对象,这就是浅拷贝(只拷贝引用)。

        比如下面这个例子,我这个对象的属性之后,所有的都跟着变了。(所以有时候赋值的时候要注意,别把所有的都改掉了)

    @Test
    public void test() {
        TestoneDao testoneDao = new TestoneDao(1,"张三");
        TestoneDao testOneDao1 = testOneDao;
        System.out.println(testOneDao1.equals(testOneDao));

        List list = new linkedList<>();
        Map map = new HashMap<>();

        list.add(testOneDao);
        map.put(1,list.get(0));

        System.out.println(list);
        System.out.println(map);

        testOneDao.id = 5;
        System.out.println(list);
        System.out.println(map);
        System.out.println(testOneDao1);
    }

 深拷贝:

        Object类中提供了一个方法:clone() 在看一下他的文档解释

        父类提供的这个方法是用protected修饰的,所以需要重写这个方法,同时把修饰符改成public,然后再看文档中的介绍,需要实现Cloneable接口才可以使用这个方法,否则会抛出异常

 现在用代码来测试一下:

        可以看到拷贝后的对象连Hash值都是一样的,但是修改其中一个对象后,另外一个对象并没有改变,这就等于调用clone()方法之后在堆中创建出了一个一模一样的对象,这就是深拷贝

    @Test
    public void test() {
        TestoneDao testoneDao = new TestoneDao(1,"张三");
        TestoneDao testOneDao1 = null;
        try {
            testOneDao1 = (TestOneDao) testOneDao.clone();
            System.out.println(testOneDao.hashCode());
            System.out.println(testOneDao1.hashCode());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        testOneDao.id = 2;
        System.out.println(testOneDao);
        System.out.println(testOneDao1);
        System.out.println(testOneDao.hashCode());
        System.out.println(testOneDao1.hashCode());
    }

        这里后面Hash值不一样的原因是因为我重写了HashCode方法,Hash值会被属性影响,看起来方便一点。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/274610.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号