プリミティブ型をそのまま持つことはできないため、持つことができるのはList<int>
のみです。int
List<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.ArrayList
java.util.Arrays
UnsupportedOperationException
list22
list23
明確にするために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.of
Java 9で導入されたものを使用できます。また、他の方法:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());