java List深拷贝、浅拷贝

package test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import test.ListTest.Pro;

public class CpoyListTest implements Serializable{
    /**
     * 本次测试的list中存储的值为String、Integer类型
     * @author admin
     *
     */
    static class StringInteger{
        public static void main(String[] args) {
            StringInteger stringInteger = new StringInteger();
            stringInteger.DeepCopy();
            stringInteger.ShallowCopy();
        }
        /**
         * 深拷贝
         */
        public void DeepCopy() {
            System.out.println("---------------------------DeepCopy------Begin");
            //创建数据源:
            List srcList = new ArrayList();
            srcList.add(1);
            srcList.add(2);
            
            //第一种:
            List destList1= new ArrayList(srcList);
            
            //第二种:
            List destList2= Arrays.asList(new Object[srcList .size()]);
            Collections.copy(destList2, srcList);
            
            //第三种:
            List destList3= new ArrayList();
            destList3.addAll(srcList);
            
            //第四种:
            List destList4= new ArrayList();
            for (int i = 0; i < srcList.size(); i++) {
                destList4.add(srcList.get(i));
            }
            
            //测试:
            System.out.println("源list"+srcList);//输出[1, 2]
            System.out.println("1copyList:"+destList1);//输出[1, 2]
            System.out.println("2copyList:"+destList2);//输出[1, 2]
            System.out.println("3copyList:"+destList3);//输出[1, 2]
            System.out.println("4copyList:"+destList4);//输出[1, 2]
            System.out.println("---删除源数据第一个元素");
            srcList.remove(0);
            System.out.println("---删除源数据第一个元素之后");
            System.out.println("源list"+srcList);//输出[2]
            System.out.println("1copyList:"+destList1);//输出[1, 2]
            System.out.println("2copyList:"+destList2);//输出[1, 2]
            System.out.println("3copyList:"+destList3);//输出[1, 2]
            System.out.println("4copyList:"+destList4);//输出[1, 2]

        }
        /**
         * 浅拷贝    
         */
        public void ShallowCopy() {
            System.out.println("---------------------------ShallowCopy------Begin");
            //创建数据源:
            List srcList = new ArrayList();
            srcList.add(1);
            srcList.add(2);
            
            List destList5= new ArrayList();
            destList5 = srcList;
            System.out.println("源list"+srcList);//输出[1, 2]
            System.out.println("5copyList:"+destList5);//输出[1, 2]
            System.out.println("---删除源数据第一个元素");
            srcList.remove(0);
            System.out.println("---删除源数据第一个元素之后");
            System.out.println("源list"+srcList);//输出[2]
            System.out.println("5copyList:"+destList5);//输出[2]
        }
    }
    static class CustomObject{
        public static void main(String[] args) {
            try {
                CustomObject customObject = new CustomObject();
                customObject.DeepCopy();
                customObject.ShallowCopy();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //序列化实现
        @SuppressWarnings("unchecked")
        public static List deepCopy(List src) throws IOException, ClassNotFoundException {  
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
            ObjectOutputStream out = new ObjectOutputStream(byteOut);  
            out.writeObject(src);  
          
            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
            ObjectInputStream in = new ObjectInputStream(byteIn);  

            List dest = (List) in.readObject();  
            return dest;  
        }
        /**
         * 深拷贝
         * @throws IOException
         * @throws ClassNotFoundException
         */
        public void DeepCopy() throws ClassNotFoundException, IOException {
            System.out.println("---------------------------DeepCopy------Begin");
            //创建源数据
            List srcList = new ArrayList();
            Pro pro = new CpoyListTest().new Pro();
            pro.setAge(1);
            srcList.add(pro);
            
            //序列化方式
            List destList1 = deepCopy(srcList);
            
            //普通循环创建对象方式
            List destList2= new ArrayList();//深拷贝
            for (int i = 0; i < srcList.size(); i++) {
                Pro pro2 = new CpoyListTest().new Pro();
                pro2.setAge(srcList.get(i).getAge());
                destList2.add(pro2);
            }
            System.out.println("源listAge:"+srcList.get(0).getAge());//输出1
            System.out.println("1copyListAge:"+destList1.get(0).getAge());//输出1
            System.out.println("2copyListAge:"+destList2.get(0).getAge());//输出1
            System.out.println("---修改对象属性");
            srcList.get(0).setAge(2);
            System.out.println("---修改对象属性之后");
            System.out.println("源listAge:"+srcList.get(0).getAge());//输出2
            System.out.println("1copyListAge:"+destList1.get(0).getAge());//输出1
            System.out.println("2copyListAge:"+destList2.get(0).getAge());//输出1
            
        }
        
        /**
         * 浅拷贝    
         */
        public void ShallowCopy() {
            System.out.println("---------------------------ShallowCopy------Begin");
            //创建源数据
            List srcList = new ArrayList();
            Pro pro = new CpoyListTest().new Pro();
            pro.setAge(1);
            srcList.add(pro);
            //第一种:
            List destList1= new ArrayList(srcList);
            //第二种:
            List destList2= Arrays.asList(new Pro[srcList .size()]);
            Collections.copy(destList2, srcList);
            //第三种:
            List destList3= new ArrayList();//浅拷贝
            destList3.addAll(srcList);
            //第四种:
            List destList4= new ArrayList();//浅拷贝
            for (int i = 0; i < srcList.size(); i++) {
                  destList4.add(srcList.get(i));
            }
            //第五种:
            List destList5= new ArrayList();
            destList5 = srcList;
            
            System.out.println("源listAge:"+srcList.get(0).getAge());//输出1
            System.out.println("1copyListAge:"+destList1.get(0).getAge());//输出1
            System.out.println("2copyListAge:"+destList2.get(0).getAge());//输出1
            System.out.println("3copyListAge:"+destList3.get(0).getAge());//输出1
            System.out.println("4copyListAge:"+destList4.get(0).getAge());//输出1
            System.out.println("5copyListAge:"+destList5.get(0).getAge());//输出1
            System.out.println("---修改对象属性");
            srcList.get(0).setAge(2);
            System.out.println("---修改对象属性之后");
            System.out.println("源listAge:"+srcList.get(0).getAge());//输出1
            System.out.println("1copyListAge:"+destList1.get(0).getAge());//输出1
            System.out.println("2copyListAge:"+destList2.get(0).getAge());//输出1
            System.out.println("3copyListAge:"+destList3.get(0).getAge());//输出1
            System.out.println("4copyListAge:"+destList4.get(0).getAge());//输出1
            System.out.println("5copyListAge:"+destList5.get(0).getAge());//输出1
        }
    }
    
    class Pro implements Serializable{
        private Integer age;

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
}

此链接讲的非常清楚(包括评论上的信息):http://will-turner.iteye.com/blog/1478194

你可能感兴趣的:(java)