1. 概要

この短いチュートリアルでは、 Arrays.asList(array) ArrayList(Arrays.asList(array))。の違いを見ていきます。

2. Arrays.asList

Arrays.asListメソッドから始めましょう。

この方法を使用すると、配列から固定サイズに変換できますリスト物体このリストは、配列をリストとして使用できるようにする単なるラッパーです。 データはコピーまたは作成されません

また、要素の追加または削除は許可されていないため、長さを変更することはできません。

ただし、配列内の単一のアイテムを変更することはできます。 リストの単一のアイテムに対して行ったすべての変更は、元の配列に反映されることに注意してください。

String[] stringArray = new String[] { "A", "B", "C", "D" };
List stringList = Arrays.asList(stringArray);

ここで、stringListの最初の要素を変更するとどうなるか見てみましょう。

stringList.set(0, "E");
 
assertThat(stringList).containsExactly("E", "B", "C", "D");
assertThat(stringArray).containsExactly("E", "B", "C", "D");

ご覧のとおり、元の配列も変更されています。 リストと配列の両方に、まったく同じ要素が同じ順序で含まれるようになりました。

stringListに新しい要素を挿入してみましょう。

stringList.add("F");
java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)

ご覧のとおり、リストへの要素の追加/リストからの要素の削除は、java.lang.UnsupportedOperationException。をスローします。

3. ArrayList(Arrays.asList(array))

に似ています Arrays.asList 方法、 配列からリストを作成する必要がある場合は、ArrayList <>(Arrays.asList(array))を使用できます

ただし、前の例とは異なり、これはアレイの独立したコピーです。つまり、新しいリストを変更しても元のアレイには影響しません。 さらに、要素の追加や削除など、通常のArrayListののすべての機能があります。

String[] stringArray = new String[] { "A", "B", "C", "D" }; 
List stringList = new ArrayList<>(Arrays.asList(stringArray));

次に、stringListの最初の要素を変更しましょう。

stringList.set(0, "E");
 
assertThat(stringList).containsExactly("E", "B", "C", "D");

そして今、私たちの元の配列で何が起こったのか見てみましょう:

assertThat(stringArray).containsExactly("A", "B", "C", "D");

ご覧のとおり、元のアレイは変更されていません

まとめる前に、 JDKソースコードを見ると、Arrays.asListメソッドがArrayListとは異なるタイプを返すことがわかります。 java.util.ArrayList。 主な違いは、返される ArrayList は既存の配列のみをラップすることです。つまり、addメソッドとremoveメソッドを実装していません。

4. 結論

この短い記事では、配列をArrayListに変換する2つの方法の違いを見ていきました。 これらの2つのオプションの動作と、内部配列の実装方法の違いを確認しました。

いつものように、コードサンプルはGitHubにあります。