Java 深复制和浅复制的方法

1 浅复制和深复制区别
浅复制:浅复制只是复制本对象的原始数据类型,如int、float、String,对于数组和对象引用等是不会复制的。因此浅复制是有风险的。
深复制:不但对原始数据类型进行复制,对于对象中的数组和对象引用也做复制的行为,从而达到对对象的完全复制。

2 代码示例

Java代码   收藏代码
  1. package com;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. public class Test implements Cloneable {  
  6.   
  7.     // 私有属性  
  8.     private ArrayList<String> nameList = new ArrayList<String>();  
  9.   
  10.     // 添加内容  
  11.     public void add(String s) {  
  12.         this.nameList.add(s);  
  13.     }  
  14.   
  15.     // 获得ArrayList对象  
  16.     public ArrayList<String> get() {  
  17.         return this.nameList;  
  18.     }  
  19.   
  20.     // clone方法  
  21.     @Override  
  22.     public Test clone() {  
  23.         try {  
  24.             Test test = (Test) super.clone();  
  25.             test.nameList = (ArrayList<String>) this.nameList.clone();    //A  
  26.             return test;  
  27.         } catch (CloneNotSupportedException e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         }  
  31.         return null;  
  32.     }  
  33.   
  34.     /** 
  35.      * @param args 
  36.      */  
  37.     public static void main(String[] args) {  
  38.         // 创建test对象  
  39.         Test test = new Test();  
  40.         // 设置test对象内容  
  41.         test.add("aa");  
  42.         test.add("bb");  
  43.   
  44.         // 打印显示test中的nameList内容  
  45.         System.out.println("test:" + test.get());  
  46.   
  47.         // 克隆test对象生成test2对象  
  48.         Test test2 = test.clone();  
  49.         // 添加"cc"内容到test2对象中  
  50.         test2.add("cc");  
  51.         // 打印显示test2中的nameList内容  
  52.         System.out.println("test2:" + test2.get());  
  53.   
  54.         // 打印显示test中的nameList内容  
  55.         System.out.println("test:" + test.get());  
  56.   
  57.     }  
  58. }  

 

3 浅复制运行结果

test:[aa, bb]
test2:[aa, bb, cc]
test:[aa, bb, cc]

 

4 深复制运行结果

test:[aa, bb]
test2:[aa, bb, cc]
test:[aa, bb]

 

5 结果分析
从结果分析和代码来看,深复制对浅复制只是多了A处的代码。


还有另外一种深复制的方法如下:

   public Object deepClone() throws IOException, OptionalDataException,
            ClassNotFoundException {
        // 将对象写到流里
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(bo);
        oo.writeObject(this);
        // 从流里读出来
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(bi);
        return (oi.readObject());
    }
但是这种方法传入的object对象都需要实现serializable接口


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值