java 對象深層複製,淺複製

 不能用等號,等號爲引用,賦值的只是地址,指向同一內存區域,即同一對象引用

 

  1. //淺拷貝與深拷貝 
  2.         //淺拷貝:被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。 
  3.         //換言之,淺複製僅僅複製所考慮的對象,而不復制它所引用的對象。 
  4.         //深拷貝:被複制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。 
  5.         //那些引用其他對象的變量將指向被複制過的新對象,而不再是原有的那些被引用的對象。 
  6.         //換言之,深複製把要複製的對象所引用的對象都複製了一遍。 
  7.         //1、直接賦值(字符串外都屬於淺拷貝) 
  8.         //2、使用構造函數(深拷貝) 
  9.         //3、使用clone()方法(深拷貝) 
  10.          
  11.         //字符串(不理解無colne()方法) 
  12.         String s="sss"
  13.         String t=s;   //深拷貝 
  14.         String y=new String(s); //深拷貝 
  15.         System.out.println("s:"+s+" t:"+t+" y:"+y); 
  16.         t="ttt"
  17.         y="yyy"
  18.         System.out.println("s:"+s+" t:"+t+" y:"+y); 
  19.          
  20.         //數組  
  21.         String[] ss={"111","222","333"}; 
  22.         String[] tt=ss; //淺拷貝 
  23.         String[] ww=(String[])ss.clone();//深拷貝 
  24.         System.out.println("ss:"+ss[1]+" tt:"+tt[1]+" ww:"+ww[1]); 
  25.         tt[1]="2t2"
  26.         ww[1]="2w2"
  27.         System.out.println("ss:"+ss[1]+" tt:"+tt[1]+" ww:"+ww[1]); 
  28.          
  29.          
  30.         //list列表         
  31.         ArrayList a=new ArrayList(); 
  32.         for(int i=0;i<10;i++){ 
  33.             a.add(String.valueOf(i+1)); 
  34.         } 
  35.         ArrayList b=a;//淺拷貝 
  36.         ArrayList c=new ArrayList(a);//深拷貝 
  37.         ArrayList d=(ArrayList)a.clone();//深拷貝 
  38.         System.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1)); 
  39.         b.set(1"bbb"); 
  40.         c.set(1"ccc"); 
  41.         System.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1)); 
  42.          
  43.         //HashMap 
  44.         HashMap h=new HashMap(); 
  45.         h.put("1""hhh"); 
  46.         HashMap m=h;//淺拷貝 
  47.         HashMap p=new HashMap(h);//深拷貝 
  48.         HashMap n=(HashMap)h.clone();//深拷貝 
  49.         System.out.println("h:"+h.get("1")+" m:"+m.get("1")+" p:"+p.get("1")+ " n:"+n.get("1")); 
  50.         m.put("1""mmm"); 
  51.         p.put("1","ppp"); 
  52.         n.put("1""nnn"); 
  53.         System.out.println("h:"+h.get("1")+" m:"+m.get("1")+" p:"+p.get("1")+ " n:"+n.get("1")); 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章