1. ホーム
  2. java

[解決済み] Java Collectionsのリストをコピーする方法

2022-05-04 12:51:26

質問

私は ArrayList で、それをそっくりコピーしたいのです。私は、誰かが時間をかけて正しく作ったという前提で、可能な限りユーティリティクラスを使用しています。だから当然、私は最終的に Collections クラスがあり、その中にコピーメソッドが含まれています。

次のようなものがあったとします。

List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
List<String> b = new ArrayList<String>(a.size());

Collections.copy(b,a);

これは、基本的に、以下のように考えているため失敗します。 b を保持するには十分な大きさではありません。 a . Yes I know b はサイズ0ですが、もう十分な大きさでしょう?もし私が b を先に、次に Collections.copy() は、私の中では全く無駄な関数になっています。そこで、コピー関数をプログラミングする以外(これからやりますが)、適切な方法はないでしょうか?

どのように解決するのですか?

呼び出し

List<String> b = new ArrayList<String>(a);

の浅いコピーを作成します。 a の中で b . すべての要素は b の中にあったのとまったく同じ順序で a (順番があると仮定して)。

同様に

// note: instantiating with a.size() gives `b` enough capacity to hold everything
List<String> b = new ArrayList<String>(a.size());
Collections.copy(b, a);

の浅いコピーも作成します。 a の中で b . もし最初のパラメータが b が十分でない場合 容量 (サイズではありません) をすべて含むことができます。 a の要素がある場合、その要素は IndexOutOfBoundsException . でのアロケーションは必要ないことが予想されます。 Collections.copy を実行し、もし実行された場合はその例外をスローします。これは、コピーされたコレクションが事前に割り当てられていることを要求するための最適化です ( b しかし、私は一般的に、上記のようなコンストラクタに基づく代替案が奇妙な副作用がないことを考えると、必要なチェックのためにこの機能を使用する価値があるとは思いません。

ディープコピーを作成するために List のどちらかのメカニズムで、基礎となる型について複雑な知識を持っている必要があります。の場合 String は、Java(と.NETも同様)では不変なので、ディープコピーさえ必要ありません。一方 MySpecialObject そのため、ディープコピーを作成する方法を知っておく必要があります。


注:当初受理された回答は、トップリザルトである Collections.copy をGoogleで検索したところ、コメントで指摘されているように、全くの誤りでした。