1

を使用することの長所と短所を知りたいArrays.asListです。コードでこれを使用しているときに問題が発生します。

また、使用せずに配列を配列リスト(コレクション)に変換する最良の方法を知りたいですArrays.asList

4

5 に答える 5

6

配列をArrayListに変換するには、次のようにします。

new ArrayList<T>(Arrays.asList(myArray));

リストを新しいArrayListでラップする必要があります。そうしないと、 asList()によって返されるリストのサイズが固定されているため、要素を追加できません。したがって、要素を追加しようとすると、UnsupportedOperationExceptionが発生します。

ただし、上記の方法が気に入らない場合は、これを実行することもできます。

Collections.addAll(arraylist, array);

私の知る限り、どちらもパフォーマンス的には同等です。


しかし、もっと重要なのは、最初の方法を使用する際の問題は何ですか?

于 2012-11-14T08:02:59.710 に答える
2

Arrays.asListを使用することの長所と短所を知りたいです。

主な「長所」は次のとおりです。

  • データのコピーは含まれません。
  • リストには、バッキング配列で行われた変更が表示されます(必要な場合)

主な「短所」は次のとおりです。

  • 「asList」ラッパーを介して要素を追加または削除することはできません。
  • リストには、バッキング配列に加えられた変更が表示されます(必要がない場合)

(明らかな制限もあります:asListプリミティブの配列に適用することはできません。しかし、プリミティブの配列を変換することはとにかく自明ではありません...)


Arrays.asListを使用せずに配列を配列リスト(コレクション)に変換する最良の方法を知りたいです

aslistを使用せずに配列をリストに変換する最も簡単な方法は次のとおりです。

new ArrayList<T>(Arrays.asList(arrayOfT))

これにより、パフォーマンスがわずかに向上する可能性があります。

ArrayList<T> list = new ArrayList<T>(arrayOfT.length);
Collections.addAll(list, arrayOfT);

ArrayList<T>(Collection<T>)コンストラクターは、一時配列を作成するために呼び出すことから開始するためですtoArray()(少なくとも、Java 7では作成します)。これは、内部で余分なコピーが行われていることを意味します。

しかし、肝心なのは、使用するだけで、それを使用しないものよりArrays.asList簡単で安価なことです。

于 2012-11-14T08:24:11.780 に答える
1

Arrays.asListを使用すると、配列をリストであるかのように見ることができます。つまり、配列への将来の変更はリストに影響を与え、リストへの将来の変更は配列に影響を与えます。それが良いことか悪いことかは、リストで何をしようとしているのか、そしてそれを配列にどのように関連付けたいかによって異なります。

使い捨てで使用する場合は、間違いなくArrays.asListを使用します。たとえば、Listにはコンテンツを表示するtoStringがあるため、System.out.println(Arrays.asList(myArray))が役立ちます。

将来の変更の影響を受けずに配列のスナップショットを保持したい場合は、引き続きArrays.asListを使用しますが、@ NNzzからの前の回答に示すように、その結​​果から新しいリストを作成します。

于 2012-11-14T08:07:04.627 に答える
1

既存の回答、特に@Stephen Cによるすばらしい回答とは別に、。にはもう1つの問題がありArrays.asListます。

効果的なJavaから


Arrays.asList複数の引数をリストに集めるように設計されたことはありませんが、varargsがプラットフォームに追加されたときに、それを改良することは良い考えのように思われました。その結果、次のようなことが可能になります。

List<String> homophones = Arrays.asList("to", ""too", "two");

この使用法は機能しますが、それを有効にするのは大きな間違いでした。

リリース1.5より前は、これは配列のコンテンツを印刷するための一般的なイディオムでした。

// Obsolete idiom to print an array!
System.out.println(Arrays.asList(myArray));

toString配列はObjectから実装を継承するため、このイディオムが必要でした。そのためtoString、配列を直接呼び出すと、などの役に立たない文字列が生成され[Ljava.lang.Integer;@3e25a5ます。このイディオムは、オブジェクト参照型の配列でのみ機能しましたが、プリミティブの配列で誤って試した場合、プログラムはコンパイルされませんでした。たとえば、このプログラムは次のとおりです。

public static void main(String[] args) {
    int[] digits = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };
    System.out.println(Arrays.asList(digits));
}

リリース1.4では次のエラーメッセージが生成されます。

Va.java:6:配列内のasList(Object [])は(int [])System.out.println(Arrays.asList(digits));に適用できません。

リリース1.5でArrays.asListをvarargsメソッドとして後付けするという不幸な決定のため、このプログラムはエラーや警告なしにコンパイルされるようになりました。

明るい面として、配列を文字列に変換するためのArrays.asListイディオムは廃止され、現在のイディオムははるかに堅牢になっています。また、リリース1.5では、Arraysクラスに、あらゆるタイプの配列を文字列に変換するために特別に設計されたArrays.toStringメソッド(varargsメソッドではありません!)の完全な補完が与えられました。Arrays.asListの代わりにArrays.toStringを使用すると、プログラムは意図した結果を生成します。

// The right way to print an array
System.out.println(Arrays.toString(myArray));
于 2017-12-17T09:11:33.440 に答える
0

Java 8以降、新しい配列を作成する最も簡単で効率的な方法は次のとおりです。

Stream.of(myArray).collect(Collectors.toList());

もう使用しない方がいい

new ArrayList<>(Arrays.asList());

これは2回の作業であるため、メモリ/パフォーマンスの低下に影響します

Arrays.asListについては、ほとんどすべての人がすでに明確に説明していると思います。Arrays.asListを使用するための悪い経験をさらに追加したいと思います。これはもうかなり前のことなので、この点ではおそらく無関係です。

数年前のあるプロジェクトでは、リストの初期化がより単純で明確であるため、常にArrays.asListを使用しています。次に、arrayListを別のメソッド、さらにはライブラリに渡します。問題は、一部のライブラリがArrays.ArrayListをArrayListと見なしていることです。したがって、java.util.ArrayListに強制的にキャストしようとすると、問題が発生します。

List<String> arrayList = Arrays.asList(x);
ArrayList<String> arr = (ArrayList) arrayList; //this will cause error
  • 一部のマッパー(例:ドーザー)は、以前にArrays.asListのメソッドシグネチャを読み取ることができないため、マッピングが失敗します。

  • また、一部のライブラリで、メソッドが呼び出されたときにUnsupportedOperationExceptionがスローされるケースもありましたが、理由はわかりません。

次に、すべてのコードをリファクタリングしてArrays.asListを削除し、再度使用しないようにしました。

したがって、1回の使用、たとえば印刷のみの使用でも問題ありませんが、値を渡すために使用したり、長期間使用したりしない方がよいでしょう。

于 2018-07-12T08:08:40.907 に答える