Java開発では、時には我々は、オブジェクトをコピーし、そして得られたオブジェクトは元のオブジェクトに影響を与えないことを保証するために、コピーを変更する必要があります。
だから、何人かの人々は、次のようなコードを書くかもしれません。
public class CloneTest {
public static void main(String[] args) {
JSONObject paramJson= new JSONObject();
paramJson.put("age",26);
paramJson.put("name","lin");
JSONObject cloneJson= paramJson;
cloneJson.put("test",27);
System.out.println("paramJson:"+paramJson.toString());
System.out.println("cloneJson:"+cloneJson.toString());
}
}
業績は次のとおりです。
paramJson:{"age":27,"name":"lin"}
cloneJson:{"age":27,"name":"lin"}
割り当て変更を取得することが分かったオブジェクトは、元のオブジェクトが変更されました。送信の値と参照渡し、既に述べたように、基準またはパラメータ通過型の割り当て、新しいオブジェクトが変更された場合、元のオブジェクトが変更されます。だから、どのように新しいオブジェクトの変更は、オブジェクトによって得られた元のコピーには影響を与えないことを確認するには?
ディープと浅いコピーコピーバックバック
オブジェクトをコピーし、新しいオブジェクトは元のオブジェクトには影響しません変更します。これは実際に深いコピーバックです。
新しいオブジェクトの変更は、それが戻って浅いコピーである、オリジナルのオブジェクトコピー結果に影響を与えます。
:基準値と理解、以下の概念から
1シャローコピー:直接新しいオブジェクトに割り当てられた元または元のオブジェクト参照配列、新しい配列は、新しいオブジェクト/参照配列は、ちょうど第一の目的である
。2.深いコピー:作成します。新しいオブジェクトや配列、元の「値」オブジェクトの属性(配列のすべての要素)コピー、「値」よりもむしろ「参照」
スーパークラスオブジェクトのJavaでは、クローン()メソッド、バックデフォルトシャローコピー。
protected Object clone()
throws CloneNotSupportedException
だから、どのようにディープコピーそれの裏?
実現ディープビートバック
apacheの-コモンズのパッケージには、いくつかのツールが戻って深いコピーを使用することができます。
1.BeanUtils。
public class DeepCloneTest {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
JSONObject paramJson= new JSONObject();
paramJson.put("age",26);
paramJson.put("name","lin");
JSONObject cloneJson= new JSONObject();
BeanUtils.copyProperties(cloneJson,paramJson);
cloneJson.put("test",27);
System.out.println("paramJson:"+paramJson.toString());
System.out.println("cloneJson:"+cloneJson.toString());
}
}
結果:
paramJson:{"name":"lin","age":26}
cloneJson:{"test":27}
2.SerializationUtils。オブジェクトのシリアル化の要件は、インターフェースを実装する必要があります。
public class DeepCloneTest {
public static void main(String[] args) {
JSONObject paramJson= new JSONObject();
paramJson.put("age",26);
paramJson.put("name","lin");
JSONObject cloneJson=SerializationUtils.clone(paramJson);
cloneJson.put("age",27);
System.out.println("paramJson:"+paramJson.toString());
System.out.println("cloneJson:"+cloneJson.toString());
}
}
結果:
paramJson:{"name":"long","age":26}
cloneJson:{"name":"long","age":27}