を使用して配列からリストを作成するjava.util.Arrays.asList()
と、リストは不変になります。List
(またはSet
またはMap
) の基本的な目的が動的なサイズを持ち、自由に要素を追加、削除できるようにすることである場合に、なぜ不変リストを作成する必要があるのか を知りたいだけです。固定サイズのデータ構造が必要な場合は Array を使用し、動的なデータ構造が必要な場合はList
or Set
orMap
などを使用します。では、不変リストを持つ目的は何でしょうか? 課題に取り組んでいるときにこれに出くわしました。
4 に答える
java.util.Arrays.asList() を使用して配列からリストを作成すると、リストは可変です。
はい、いいえ: リストは、呼び出しによって変更される場合があります。
list.set(index, element);
ただし、リストを構造的に変更することはできません。つまり、リストに要素を追加したり、リストから要素を削除したりすることはできません。単純な理由は、リストがまだ配列によってサポートされており、配列のサイズが変わらない可能性があるためです。
固定サイズの可変コレクションが必要な場合は、配列を使用します
そして、それがここでの重要なポイントです: 配列はCollectionではありません。このメソッドは、主に「配列の世界」と「コレクションの世界」の間の「架け橋」として機能します。Arrays.asList
Arrays.asList
メソッドを使用すると、たとえば、以下を期待するメソッドにデータを渡すことができますCollection
。
// A method that expects a collection:
void process(List<String> strings) { ... }
void call()
{
String array[] = new String[] { "A", "B", "C" };
// Pass the array (as a list) to the method:
process(Arrays.asList(array));
}
このアプリケーション ケースには、配列から他のコレクションを作成することが含まれます。たとえば、配列があり、配列Set
の要素を含む を作成する場合は、次のようにすることができます。
String array[] = new String[] { "A", "B", "C" };
Set<String> set = new HashSet<String>();
for (String s : array)
{
set.add(s);
}
しかし、Arrays.asList
メソッドを使用すると、これをより便利に行うことができます。
Set<String> set = new HashSet<String>(Arrays.asList(array));
このArrays.asList
メソッドは、いわばCollection#toArrayメソッドの対応物であり、反対方向に機能します (ただし、このメソッドは通常、新しい配列の作成と入力を伴いますが、このメソッドはArrays.asList
単に配列を「ラップ」して「見える」ようにします)。 a List
)。
これはadd()
、クラスAbstractListが原因で、 Arrays Java クラス (内部で使用される) の下のカスタマイズされた ArrayList (内部静的クラス) によって拡張されます。この add() メソッドは、java.util.ArrayList で定義されているものと同じではなく、のメソッドであることに注意してくださいjava.util.Arrays$ArrayList
。
配列には、jvm によってネイティブに提供される固定サイズのプロパティがあります。Arrays.copyOf() が のようにサイズを大きくして使用されている場合でもArrays.copyOf(arr, 10); //10 is the length
、元の配列はarr= int[]{1,2} // size is two
です。最終的にネイティブメソッドを呼び出す新しい配列を常に作成します。System.arraycopy()
[static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)]
上記のリストにはサイズ制限のみがあることに注意してください。本当に変更可能なリストを不変にしたい場合は、使用してみてくださいCollections.unmodifiableList(mutableList);
。https://stackoverflow.com/a/42071121/5620851およびhttps://stackoverflow.com/a/42138471/5620851を参照してください