Javaのオブジェクトのディープコピーを達成するための二つの方法が
免責事項:この記事はブロガーオリジナル記事です、続く BY-SAのCC 4.0を 著作権契約、複製、元のソースのリンクと、この文を添付してください。
1は、クラスがCloneableインタフェースダイレクトコールクローン()メソッドを実装していない場合は、異常なCloneNotSupportedExceptionを報告します、私はすでにオブジェクトのソースコードに書きました:
-
*このインスタンスの複製@return。
-
* @exceptionのCloneNotSupportedExceptionオブジェクトのクラスがない場合
-
* {@code Cloneableを}インターフェースをサポートしています。サブクラス
-
*つまり{@codeクローン}メソッドをオーバーライドすることもでき
-
*インスタンスがないことを示すためにこの例外をスロー
-
*クローニングすること。
-
* @see java.lang.Cloneable
-
* /
-
ネイティブオブジェクトのクローンを()CloneNotSupportedExceptionをスロー保護。
また、ソースコードはまた、クローンオブジェクト()メソッドに書き込まれ、私が書かれている前にオブジェクトのソースコード解析である、浅いコピーです。
2、ディープコピーメソッドを実装するカスタムクラスが2種類、順次以下に示す具体的な文言があります。
2.1、カスタムクラスは、Cloneableインタフェースを実装し、クローン()メソッドをオーバーライドします。
-
/ **
-
*ディープコピーとテストのシャローコピー
-
* /
-
//テストカテゴリ1
-
クラスの人は、実装のCloneableを{
-
文字列の名前。
-
int型の年齢;
-
人物(文字列名、 int型の年齢){
-
this.name =名前;
-
this.age =年齢;
-
}
-
-
パブリックオブジェクトクローン(){
-
{試します
-
リターンsuper.clone();
-
} キャッチ(CloneNotSupportedException電子){
-
リターンNULL;
-
}
-
}
-
}
-
//テストクラス2
-
-
クラス動物は実装Cloneableをを{
-
人をホスト; //所有者
-
年齢はint; //古いです
-
動物(人の人物、 int型の年齢){
-
this.host =人。
-
this.age =年齢;
-
}
-
-
パブリックオブジェクトクローン(){
-
{試します
-
動物動物=(動物) super.clone();
-
= animal.host(人)host.clone(); //プロセス深いコピー
-
動物を返します。
-
} キャッチ(CloneNotSupportedException電子){
-
リターンNULL;
-
}
-
}
-
}
-
-
//テスト
-
パブリッククラスメイン{
-
パブリック静的ボイドメイン(文字列[]引数){
-
人物PERSON1 = 新しい人("cxh"、26);
-
人PERSON2 =(人物)person1.clone();
-
System.out.println( "浅いコピー---------------- --------------");
-
シャローコピーをテストするための//オブジェクトのcloneメソッド
-
// Stringクラス==テストでは、メモリアドレスと一致しています
-
System.out.println( "PERSON1 PERSON2と同じメモリアドレス名:" +(person1.name == person2.name) );
-
-
-
-
System.out.println( "---------------- --------------ディープコピー")。
-
//オブジェクトのcloneメソッドをオーバーライドし、深いコピーを実現
-
//または2つのオブジェクトが二つのオブジェクトかどうかを判断するために同じメモリアドレスであり、二つのメモリアドレスならば、その深いコピーで見に==を使用
-
動物animal1 = 新しい動物(新しい人物("cxh"、26)、3)。
-
動物animal2 =(動物)animal1.clone();
-
System.out.println( "animal1 animal2ホストと同じメモリアドレス:" +(animal1.host == animal2.host) )。
-
}
-
}
出力:
-
---------------- --------------シャローコピー
-
PERSON1と名前のメモリアドレスが同じであるPERSON2: trueに
-
---------------- --------------深いコピー
-
animal1とanimal2ホストメモリアドレスは同じです: 偽
-
-
プロセス終了 と終了コード0
ブログの非常に詳細な説明:http://blog.csdn.net/zhangjg_blog/article/details/18369201
2.2、シーケンスのディープコピーの方法によって達成される:オブジェクトをコピーする最初は、メモリ内のバイトストリームに書き込まれ、その後、新しいオブジェクトが返されると同じように保存された情報から、バイトストリームを読み込むされ、その後、新しいオブジェクトそして共有元のオブジェクトは、自然の深いコピーを達成するために、任意のアドレスに存在していません。
カスタムクラスはSerializableインタフェースを実装する必要があります。
-
輸入java.io. *;
-
-
/ **
-
*ディープコピーとテストのシャローコピー
-
*それを完了するために、オブジェクトの直列化されたコピーを使用する方法?バイトストリームのコピーは介してメモリに実装することは比較的容易です。親オブジェクトをバイトストリームに書き込まれ、それは、バイトストリームから読み込まれます
-
*これは、新しいオブジェクトを作成し、新しいオブジェクトと親オブジェクト間の参照および共有の問題、実際のオブジェクトのディープコピーはありません。
-
* /
-
//ツール
-
クラスCloneUtil {
-
パブリック静的<Tはシリアライズ延び> Tのクローン{(TのOBJ)を
-
T cloneObj = NULL;
-
{試します
-
//書き込みバイトストリーム
-
ByteArrayOutputStreamたBAO = 新しいByteArrayOutputStream();
-
ObjectOutputStreamのOOS = 新しいObjectOutputStreamの(のBAO)。
-
oos.writeObject(OBJ)。
-
oos.close();
-
-
//、メモリを割り当てる元のオブジェクトを作成し、新しいオブジェクトを生成します
-
BAIS = AれるByteArrayInputStream 新しい新AれるByteArrayInputStream(baos.toByteArray()); //上記出力バイトストリームを取得します。
-
ObjectInputStreamのOIS = 新しいObjectInputStreamの(BAIS)。
-
-
//生成された新しいオブジェクトを返します。
-
cloneObj =(T)ois.readObject();
-
ois.close();
-
} キャッチ(例外e){
-
e.printStackTrace();
-
}
-
cloneObjを返します。
-
}
-
}
-
-
//テストカテゴリ1
-
クラスの人は、実装{シリアライズ
-
文字列の名前。
-
int型の年齢;
-
人物(文字列名、 int型の年齢){
-
this.name =名前;
-
this.age =年齢;
-
}
-
-
}
-
//テストクラス2
-
-
クラス動物は、実装{シリアライズ
-
人をホスト; //所有者
-
年齢はint; //古いです
-
動物(人の人物、 int型の年齢){
-
this.host =人。
-
this.age =年齢;
-
}
-
}
-
-
-
//テスト
-
パブリッククラスメイン{
-
パブリック静的ボイドメイン(文字列[]引数){
-
System.out.println( "---------------- --------------ディープコピー")。
-
//オブジェクトのcloneメソッドをオーバーライドし、深いコピーを実現
-
//または2つのオブジェクトが二つのオブジェクトかどうかを判断するために同じメモリアドレスであり、二つのメモリアドレスならば、その深いコピーで見に==を使用
-
動物animal1 = 新しい動物(新しい人物("cxh"、26)、3)。
-
動物animal2 = CloneUtil.clone(animal1)。
-
System.out.println( "animal1 animal2ホストと同じメモリアドレス:" +(animal1.host == animal2.host) )。
-
}
-
}
出力:
-
---------------- --------------深いコピー
-
animal1とanimal2ホストメモリアドレスは同じです: 偽
参考ブログ: http://blog.csdn.net/chenssy/article/details/12952063