web-dev-qa-db-ja.com

Java HashMap-ディープコピー

私はHashMapのディープコピーを作成する最良の方法を見つけようとしています。このマップには、Cloneableを実装するオブジェクトがありません。シリアル化と逆シリアル化よりも良い解決策を見つけたいと思います。

16
Smolda

Deep Cloningを見てください。GoogleCodeでライブラリを見つけることができます。 https://github.com/kostaskougios/cloning で読むことができます。

仕組みは簡単です。これは任意のオブジェクトのクローンを作成でき、オブジェクトはシリアル化可能などのインターフェイスを実装する必要はありません。

Cloner cloner = new Cloner();
MyClass clone = cloner.deepClone(o);
// clone is a deep-clone of o

ただし、これは何千ものオブジェクトを複製する可能性があることに注意してください(複製されたオブジェクトがそのように多くの参照を持っている場合)。また、ファイルまたはストリームをコピーすると、JVMがクラッシュする可能性があります。

ただし、ストリームなどのクラスの特定のインスタンスは無視できます。このライブラリとそのソースをチェックアウトする価値があります。

13
stealthjong

一般的な方法で実装できるとは思いません。

  • 単にクローンを実装する機会があれば、私はそのように行きます。
  • もう少し複雑なのは、型マップの作成です。ここでは、各オブジェクトのクラスに基づいて、ある種のクローン実装クラスを検索します。
  • オブジェクトが有向非巡回グラフを形成する可能性がある場合、私は通常、マップを元のオブジェクトから今まで見たすべてのオブジェクトのクローンに保持し、すでに作成したかどうかを確認します
  • 一般的なグラフがあると、問題は非常に厄介になります。オブジェクトの作成順序に奇妙な制約があるかもしれませんが、最終フィールドがある場合は不可能かもしれません。

とりあえず、一般的ではない方法で質問を書き直すことをお勧めします

3
hyperman

これは簡単ではありません。次のような回避策を使用しています。

1)マップをjson文字列に変換します。 (たとえば、Google Gsonを使用)

2)json文字列を変換してマップに戻します。

パフォーマンスの問題がありますが、これが最も簡単な方法です。

1
GMsoF