3つの深さコピー方式の比較
4308 ワード
深度コピーには、主に3つの方法があります.シーケンス化と逆シーケンス化,json変換,および手動付与により,これら3つの方式を簡単に比較する.テストをコピーする対象は次のとおりです.シーケンス化方式:ここではapacheを採用する.common.langパッケージのSerializationUtils.clone()ツールクラス.ここでは単純オブジェクトの深度コピーを10 w回行うのに要する時間をテストし、シーケンス化方式で深度コピーのテストコードは以下の通りである: .
私のノートパソコンの平均消費時間は約2100 msです. json変換方式:ここではアリのfastjsonを採用する.同時に10 w回の単純オブジェクトの深いコピーをテストし、テストコードは以下の通り:
約900 msの時間がかかります.json方式を使用する主な制限は、オブジェクトに他の参照タイプやカスタム属性がある場合、オブジェクトをjson文字列に変換するときにこれらの属性をjson変換し、その後、この変換で得られたjson文字列でオブジェクトを生成する場合、これらの属性のオブジェクトタイプが指定されていないため、エラーが発生することです.手動付与方式:便宜上、ここではnew User(user)による深いコピーという構造方法を採用する.10 w回の平均消費時間は約5 msであった.
まとめ:手動で値を割り当てる方法は、他の2つの方法に比べて速度的に絶対的な優位性があることがわかりますが、特に属性に参照タイプや他の複雑なカスタム属性が含まれている場合、手動で値を割り当てるのは難しい場合があります.シーケンス化を使用する方法が最も遅く、コピーするオブジェクトのクラスがSerializableインタフェースを実装する必要があります.jsonを使用すると高速ですが、カスタムタイプのプロパティのあるオブジェクトには適用できません.
class User implements Serializable{
private String name;
private String pwd;
private int age;
public User() {
}
public User (User u){
this.name = u.getName();
this.age = u.getAge();
this.pwd = u.getPwd();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
User user = new User();
user.setName("shamo");
user.setPwd("123");
user.setAge(25);
long start = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
SerializationUtils.clone(user);
}
System.out.println(System.currentTimeMillis() - start);
私のノートパソコンの平均消費時間は約2100 msです.
long start = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
deepCopyByJson(user);
}
System.out.println(System.currentTimeMillis() - start);
private Object deepCopyByJson(Object obj) {
String json = JSON.toJSONString(obj);
return JSON.parseObject(json, Object.class);
}
約900 msの時間がかかります.json方式を使用する主な制限は、オブジェクトに他の参照タイプやカスタム属性がある場合、オブジェクトをjson文字列に変換するときにこれらの属性をjson変換し、その後、この変換で得られたjson文字列でオブジェクトを生成する場合、これらの属性のオブジェクトタイプが指定されていないため、エラーが発生することです.
まとめ:手動で値を割り当てる方法は、他の2つの方法に比べて速度的に絶対的な優位性があることがわかりますが、特に属性に参照タイプや他の複雑なカスタム属性が含まれている場合、手動で値を割り当てるのは難しい場合があります.シーケンス化を使用する方法が最も遅く、コピーするオブジェクトのクラスがSerializableインタフェースを実装する必要があります.jsonを使用すると高速ですが、カスタムタイプのプロパティのあるオブジェクトには適用できません.