日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 深克隆_Java实现深克隆的两种方式

發布時間:2025/3/20 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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: 啟動線程對 ...

&lbrack;Java&rsqb; HashMap遍歷的兩種方式

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的java 深克隆_Java实现深克隆的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。