深拷贝与浅拷贝(Java)

  • 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
  • 深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

        //1、直接赋值(字符串外都属于浅拷贝)
        //2、使用构造函数(深拷贝)
        //3、使用clone()方法(深拷贝)

        //字符串(不理解无colne()方法)
        String s="sss";
        String t=s;   //深拷贝
        String y=new String(s); //深拷贝
        System.out.println("s:"+s+" t:"+t+" y:"+y);
        t="ttt";
        y="yyy";
        System.out.println("s:"+s+" t:"+t+" y:"+y);

        //数组 
        String[] ss={"111","222","333"};
        String[] tt=ss; //浅拷贝
        String[] ww=(String[])ss.clone();//深拷贝
        System.out.println("ss:"+ss[1]+" tt:"+tt[1]+" ww:"+ww[1]);
        tt[1]="2t2";
        ww[1]="2w2";
        System.out.println("ss:"+ss[1]+" tt:"+tt[1]+" ww:"+ww[1]);


        //list列表        
        ArrayList a=new ArrayList();
        for(int i=0;i<10;i++){
            a.add(String.valueOf(i+1));
        }
        ArrayList b=a;//浅拷贝
        ArrayList c=new ArrayList(a);//深拷贝
        ArrayList d=(ArrayList)a.clone();//深拷贝
        System.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1));
        b.set(1, "bbb");
        c.set(1, "ccc");
        System.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1));

        //HashMap
        HashMap h=new HashMap();
        h.put("1", "hhh");
        HashMap m=h;//浅拷贝
        HashMap p=new HashMap(h);//深拷贝
        HashMap n=(HashMap)h.clone();//深拷贝
        System.out.println("h:"+h.get("1")+" m:"+m.get("1")+" p:"+p.get("1")+ " n:"+n.get("1"));
        m.put("1", "mmm");
        p.put("1","ppp");
        n.put("1", "nnn");
        System.out.println("h:"+h.get("1")+" m:"+m.get("1")+" p:"+p.get("1")+ " n:"+n.get("1"));
Java中,深拷贝浅拷贝是指对象复制的方式,它们的区别在于是否完全复制对象的所有引用。这里我将简述一下以及给出相应的代码示例: **浅拷贝(Shallow Copy):** 浅拷贝复制了对象的引用,如果原对象内部有其他对象或数组,这些会被共享。这意味着对新副本所做的修改会影响到原对象。 ```java public class Test { public static void main(String[] args) { List<String> originalList = new ArrayList<>(); originalList.add("A"); originalList.add("B"); // 浅拷贝 List<String> shallowCopy = originalList; // 这是一个引用复制,不是实际的对象复制 System.out.println(originalList); // [A, B] System.out.println(shallowCopy); // [A, B] shallowCopy.set(0, "Changed"); // 修改副本影响到原对象 System.out.println(originalList); // [Changed, B] } } ``` **深拷贝(Deep Copy):** 深拷贝则是对整个对象及其所有嵌套对象进行完整的复制,包括所有成员变量的值和引用。这样,修改副本不会影响到原对象。 ```java import java.util.ArrayList; import java.util.List; public class DeepCopyExample { public static void main(String[] args) { List<String> originalList = new ArrayList<>(); originalList.add("A"); originalList.add("B"); // 深拷贝 List<String> deepCopy = new ArrayList<>(originalList); // 使用构造函数创建新的ArrayList,并传入原始列表的引用 System.out.println(originalList); // [A, B] System.out.println(deepCopy); // [A, B] deepCopy.set(0, "Changed"); // 修改副本不影响原对象 System.out.println(originalList); // [A, B] } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值