少し遅いようですが、ここは私の2セントです。我々は持つことができないList<int>
としてint
、我々が唯一持っていることができるようにプリミティブ型ですList<Integer>
。
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
リストではなくArrayListが必要ですか?
List
たとえば、特定の実装が必要な場合は、次のArrayList
ように使用できますtoCollection
。
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
list21
構造的に変更できないのはなぜですか?
使用Arrays.asList
する場合、返されるリストのサイズは固定されているため、返されるリストのサイズは固定されていますjava.util.ArrayList
が、内部で定義されているプライベート静的クラスjava.util.Arrays
です。したがって、返されたリストに要素を追加または削除するUnsupportedOperationException
と、がスローされます。したがってlist22
、リストを変更する場合は、このままでかまいません。Java8を使用している場合は、も使用できlist23
ます。
明確にlist21
することは、呼び出すことができるという意味で変更できますlist21.set(index,element)
が、このリストは構造的に変更されない可能性があります。つまり、リストに要素を追加または削除できません。この質問も確認できます。
不変のリストが必要な場合は、次のようにラップできます。
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
注意すべきもう1つの点は、メソッドCollections.unmodifiableList
が指定されたリストの変更不可能なビューを返すことです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションのビューでもあります。バッキングコレクションへの変更はまだ可能であることに注意してください。変更が発生した場合は、変更不可能なビューから確認できます。
Java 9と10では、真に不変のリストを持つことができます。
真に不変のリスト
Java 9:
String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);
2つの方法でJava 10(真の不変リスト):
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
詳細については、この私の答えを確認してください。
Arrays.asList(new int[] { 1, 2, 3 })
; ので、間違いなく、Javaの1.4.2でコンパイルしていなかったint[]
ですではありませんObject[]
。