1174

Javaで配列をリストに変換するにはどうすればよいですか?

私は使用しましたArrays.asList()が、動作(および署名)がJava SE 1.4.2(現在アーカイブにあるドキュメント)から8に変更され、Webで見つけたほとんどのスニペットは1.4.2の動作を使用しています。

例えば:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • on 1.4.2は、要素1、2、3を含むリストを返します。
  • 1.5.0以降では、配列スパ​​ムを含むリストが返されます

多くの場合、簡単に検出できるはずですが、気付かないうちに滑ってしまうこともあります。

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
4

21 に答える 21

1599

あなたの例では、プリミティブ型のリストを持つことができないためです。つまり、List<int>ありえない。

ただし、プリミティブをラップするクラスをList<Integer>使用することはできます。ユーティリティ メソッドを使用して配列を に変換します。IntegerintListArrays.asList

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

IdeOne.com でこのコードのライブ実行を参照してください。

于 2010-04-09T12:27:23.720 に答える
154

プリミティブ型をそのまま持つことはできないため、持つことができるのはList<int>のみです。intList<Integer>

ジャワ 16

Java 16 では、Stream API に と呼ばれる新しいメソッドが導入されていますtoList()。この便利なメソッドは、ストリーム要素を含む変更不可能なリストを返します。そのため、新しい要素をリストに追加しようとすると、単純にUnsupportedOperationException.

int[] ints = new int[] {1,2,3,4,5};
Arrays.stream(ints).boxed().toList();

Java 8 (int 配列)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 以下 (整数配列)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

List ではなく ArrayList が必要ですか?

Listたとえば、特定の実装が必要な場合は、次のArrayListように使用できますtoCollection

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

なぜlist21構造的に変更できないのですか?

返されるリストは ではなく、内部で定義されたプライベートな静的クラスであるためArrays.asList、返されるリストのサイズは固定されます。したがって、返されたリストに要素を追加または削除すると、がスローされます。したがって、リストを変更したい場合は を使用する必要があります。Java8 がある場合は、.java.util.ArrayListjava.util.ArraysUnsupportedOperationExceptionlist22list23

明確にするためにlist21、呼び出すことができるという意味で変更できますlist21.set(index,element)が、このリストは構造的に変更できない場合があります。つまり、リストに要素を追加または削除することはできません。詳細については、この私の回答を確認することもできます。


不変リストが必要な場合は、次のようにラップできます。

List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers));

もう 1 つの注意点は、メソッドCollections.unmodifiableListが指定されたリストの変更不可能なビューを返すことです。変更不可能なビュー コレクションは、変更不可能なコレクションであり、バッキング コレクションに対するビューでもあります。バッキング コレクションへの変更は引き続き可能であることに注意してください。変更が発生した場合、変更不可能なビューを通じて表示されます。

Java 9 および 10 では、真に不変なリストを使用できます。

真に不変なリスト

Java 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

Java 10 (真に不変なリスト):

List.ofJava 9で導入されたものを使用できます。また、他の方法:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
于 2015-12-23T05:07:03.127 に答える
126

問題は、varargs が Java5 で導入され、残念ながら、Arrays.asList()vararg バージョンでもオーバーロードされたことです。そのArrays.asList(spam)ため、Java5 コンパイラは int 配列の vararg パラメータとして認識します。

この問題は、Effective Java 2nd Ed.、Chapter 7、Item 42 で詳しく説明されています。

于 2010-04-09T12:26:26.107 に答える
16

最近、配列をリストに変換する必要がありました。その後、プログラムはデータを削除しようとしてリストをフィルタリングしました。Arrays.asList(array) 関数を使用すると、固定サイズのコレクションが作成されます。追加も削除もできません。リストから要素を削除しようとすると UnsupportedOperationException が発生するのはなぜですか? .

結局、「手動」変換を行う必要がありました。

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

List.addAll(items) 操作を使用して、配列からリストへの変換を追加できたと思います。

于 2014-08-31T17:26:24.063 に答える
12

さらに短い:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
于 2016-03-17T09:55:05.010 に答える
7

Java 8 (またはそれ以降) をターゲットにしている場合は、これを試すことができます。

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

ノート:

に注意してください。この一般的な方法は、「タイプの不一致: からにCollectors.<Integer>toList()変換できません」というエラーを回避するのに役立ちます。List<Object>List<Integer>

于 2016-08-12T14:52:00.470 に答える
7

Apache commons-lang を使用する場合の別の回避策:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

ArrayUtils.toObjectが変換される場所int[]Integer[]

于 2015-09-21T12:27:21.820 に答える
7

一発ギャグ:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
于 2016-03-11T04:15:46.047 に答える
6

配列にキャストする必要があります

Arrays.asList((Object[]) array)
于 2014-08-12T13:08:19.573 に答える