いくつかの Object[] と ArrayListのディープ コピーを作成したいのですが、どうすればそれを行うことができますか (ループせずに、クローンを呼び出さずに)
これを行うための標準ユーティリティはありませんか?
ありがとうジョアン
配列全体をシリアライズしてから、デシリアライズして新しい変数にすることができます。これにより、効果的にディープ コピーが実行されます。
そうしないと、自分でディープ コピーを実装する必要があります。
単純なオブジェクトは、コピーをサポートするためにいくつかを提供する必要はありません。たとえそれが Clone または Serialize を実装する形であってもです。これが多かれ少なかれ組み込みメソッドがなく、ループが避けられない理由です。
それがすべて独自のコードである場合は、クローンまたはシリアル化/逆シリアル化よりもオブジェクト指向のコピー コンストラクターをお勧めします。JVM に低レベルのコピーを要求するのではなく、オブジェクトに独自のコピーを作成するように要求します。このようなコードは非常にシンプルで読みやすいので、長期的には維持費が安く済むことを願っています。
public class Widget {
private int x = 0;
public Widget(Widget copyMe){
this.x = copyMe.x;
// ...
}
// ....
}
もちろん、古いコレクションをループして、コピー コンストラクターを呼び出して新しいコレクションを生成するループが必要です。クローンとシリアライズの落とし穴について詳しく説明している『Effective Java』という本を強くお勧めします。
非常に高速なコピーやソートなどを実際に必要とするシステムがいくつかあります (例: Hadoop)。このようなシステムでは、カスタム バイナリ形式 (たとえば、 byte[] getAsBytes() / public Widget(byte[] fromBytes) ) をサポートする責任が開発者に課せられます。byte[] に変換された多くのオブジェクトをより大きな配列にパックすることは、大きな配列で System.arraycopy を使用して一度にすべてを非常に高速にコピーできることを意味します。JVM は System.arraycopy を低レベルのメモリ コピーとして実行します。コピー後にバイトのチャンクからオブジェクトを逆シリアル化するために、ループが必要になります。
一般に、コンパイラと jvm は基本的なコードを非常にうまく最適化する傾向があるため、実際に測定可能なパフォーマンスの問題があることを実際に測定しない限り、非常に読みやすいコピー コンストラクターを使用した非常に単純なループが長期的には最良のアプローチになります。