java 深克隆_Java实现深克隆的两种方式
序列化和依次克隆各個可變的引用類型都可以實現深克隆,但是序列化的效率并不理想
下面是兩種實現深克隆的實例,并且測試類對兩種方法進行了對比:
1、重寫clone方法使用父類中的clone()方法實現深克隆
package com.lk.B;
public class Worker implements Cloneable{
private String name;
private int age;
public Worker(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
sb.append("姓名:"+name+",");
sb.append("年齡:"+age+"\n");
return sb.toString();
}
@Override
protected Worker clone() {
// TODO Auto-generated method stub
Worker worker = null;
try {
worker = (Worker) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return worker;
}
}
2、重寫clone()方法使用序列化方法實現深克隆
package com.lk.B;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Employee implements Cloneable,Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Employee(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
sb.append("姓名:"+name+",");
sb.append("年齡:"+age+"\n");
return sb.toString();
}
@Override
protected Employee clone() {
// TODO Auto-generated method stub
Employee employss = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
try {
ObjectInputStream ois = new ObjectInputStream(bais);
employss = (Employee) ois.readObject();
ois.close();
} catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return employss;
}
}
兩者的實現方式在上面已經列出來了
下面編寫了一個測試類來測試兩種方式的效率
package com.lk.B;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
List workerList = new ArrayList();//保存Worker對象
List employeelist = new ArrayList();//保存Employee對象
Worker worker = new Worker("阿坤", 21);
Employee employee = new Employee("阿坤", 21);
long time = System.currentTimeMillis();//取得系統當前時間
//保存10000個Worker對象復制品到列表
for(int i=0;i<10000;i++){
workerList.add(worker.clone());
}
System.out.println("使用復制域的方式實現克隆所花費的時間:"+(System.currentTimeMillis()-time)+"ms");
time = System.currentTimeMillis();//取得系統當前時間
//保存10000個Employee對象復制品到列表
for(int i=0;i<10000;i++){
employeelist.add(employee.clone());
}
System.out.println("使用復制域的方式實現克隆所花費的時間:"+(System.currentTimeMillis()-time)+"ms");
}
}
運行結果:
/*
使用復制域的方式實現克隆所花費的時間:4ms
使用復制域的方式實現克隆所花費的時間:838ms
*/
可以看出,可以使用序列化和逐個復制引用類型域的方式完成深克隆,其中序列化的方式效率很低。
對Java代碼加密的兩種方式,防止反編譯
使用Virbox Protector對Java項目加密有兩種方式,一種是對War包加密,一種是對Jar包加密.Virbox Protector支持這兩種文件格式加密,可以加密用于解析class文件的j ...
Java新建線程的兩種方式
Java新建線程有兩種方式,一種是通過繼承Thread類,一種是實現Runnable接口,下面是新建線程的兩種方式. 我們假設有個競賽,有一個選手A做俯臥撐,一個選手B做仰臥起坐.分別為兩個線程: p ...
Java實現多線程的兩種方式
實現多線程的兩種方式: 方式1: 繼承Thread類 A: 自定義MyThread類繼承Thread類 B: 在MyThread類中重寫run() C: 創建MyThread類的對象 D: 啟動線程對 ...
[Java] HashMap遍歷的兩種方式
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java 深克隆_Java实现深克隆的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python做问答测试_测试用户输入P
- 下一篇: java url 上传文件_Java使用