この記事では、javaのリストを一行で初期化するためのさまざまな方法について説明します。
Javaはしばしばその冗長性のために批判されます。,structing it, storing it in a variable, invoking add()
method on it n times, and then maybe wrapping it to make it unmodifiable:
1
2
3
4
5
6
7
|
List<String> list = new ArrayList<>();
list.,add(“C”);
リスト。add(“C++”);
リスト。add(“Java”);
リスト=コレクション。unmodifiableList(list);
|
この記事では、リストを単一の式で初期化するさまざまな方法について説明します。
配列。asList()
Arrays.asList()
指定された配列によってバックアップされた固定サイズのリストを返します。 配列を構造的に変更することはできないため、リストに要素を追加したり、リストから要素を削除したりすることはできません。, The list will throw an UnsupportedOperationException
if any resize operation is performed on it.
1
|
List<String> fixedLengthList = Arrays.,asList(“C”, “C++”, “Java”);
|
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(Arrays.,asList(“C”,”C++”,”Java”));
|
Java Collections
Collectionsクラスは、コレクションを操作し、指定されたコレクションに基づいて新しいコレクションを返すいくつかの静的
⮚コレクション。addAll()
Collections.addAll()
指定された要素をすべて指定されたコレクションに追加します。 追加する要素は、個別に指定するか、配列として指定することができます。, When elements are specified individually, this method provides a convenient way to add a few elements to an existing collection:
1
2
|
List<String> list = Collections.EMPTY_LIST;
Collections.,addAll(list=new ArrayList<String>(),”C”,”C++”,”Java”);
|
↑コレクション。unmodifiableList()
または、別のコレクションからコピーコンストラクタを使用してコレクションを移入できます。 そのようなメソッドの一つは、Collections.unmodifiableList()
指定されたリストの変更不可能なビューを返します。 返されたリストを変更しようとすると、UnsupportedOperationException
になります。
⮚コレクション。,singletonList()
単一の要素のみを含むリストが必要な場合は、その要素を含む不変のリストを返すCollections.singletonList()
を使用できます。 リストに対して変更操作が実行された場合、リストはUnsupportedOperationException
をスローします。
1
|
リスト<文字列>リスト=コレクション。,singletonList(“Java”);
|
ダブルブレース初期化
別の選択肢は、”ダブルブレース初期化”を使用することです。 これにより、インスタンス初期化子だけを持つ匿名の内部クラスが作成されます。 この手法は、使用ごとに余分なクラスがかかり、囲むインスタンスおよびキャプチャされたオブジェクトへの隠し参照も保持されるため、避ける これにより、メモリリークやシリアル化の問題が発生する可能性,v>2
java8h3java8stream apiを使用して、静的ファクトリメソッドからstreamを取得し、collectorを使用して入力要素を新しいリストに蓄積することで、小さなリストを構築できま, For example,
⮚ Collectors.toList()
Collectors.toList()
returns a Collector that accumulates the input elements into a new List.
1
2
|
List<String> list = Stream.of(“C”, “C++”, “Java”)
.collect(Collectors.toList());
|
⮚ Collectors.,toCollection()
The streams collectors make no guarantee on the type of the List
returned by toList()
. To ensure the returned List
is ArrayList
, we can use toCollection(Supplier)
as shown below:
1
2
|
List<String> list = Stream.,”C”,”C++”,”Java”,”C++”,”C++”,”C++”,”C++”,”C++”,”C++”,”C++”コレクト(コレクター。toCollection(ArrayList::new));
|
↑コレクター。collectingAndThen()
追加の仕上げ変換を実行するためにCollectorを適応させることができます。, たとえば、toList()
コレクターを適応させて、常に変更不可能なリストを生成することができます。
Java9
Java9は、Lists.of()
コンパクトで変更不可能なインスタンスを作成する静的ファクトリメソッドを提供することにより、少数の要素を持つリストのインスタンスを作成することを便利にしました。, For example,
1
|
List<String> unmodifiableList = List.of(“C”, “C++”, “Java”);
|
Java 9 provides 12 overloaded versions of this method –
Note there is a var-args version which can handle any number of elements., 今明らかな質問は、Var-argsだけで十分できるJava9が非常に多くの余分なメソッドを含んでいる理由ですか? その理由は、あの微妙なランタイムの性能です。 Var-argsバージョンは、varargsを使用しないオーバーロードよりも遅く実行される可能性があります。 これは、varargsメソッドを呼び出すたびに配列の割り当てと初期化が発生し、GCのオーバーヘッドが忘れられないためです。
Javadocに従って、List.of()
によって作成されたリストインスタンスには、次の特性があります。
- これらは構造的に不変です。, 要素を追加、削除、または置換することはできません。 任意のミューテータメソッドを呼び出すと、常に
UnsupportedOperationException
がスローされます。 ただし、含まれている要素自体が変更可能な場合、リストの内容が変更される可能性があります。 - null要素を許可しません。 Null要素を使用してそれらを作成しようとすると、
NullPointerException
になります。 - すべての要素が直列化可能な場合、それらは直列化可能です。
- リスト内の要素の順序は、指定された引数の順序、または指定された配列内の要素の順序と同じです。,
- これらは値ベースです。 呼び出し側うな前提はのアイデンティティ返される場合がございます。 工場への新規インスタンスを作成または再利用を設定しています。 そのため、アイデンティティに依存する操作はこのインスタンス参考平等(==),アイデンティティハッシュコードと同期)信頼できないため、回避されるべきである。,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,of(“C”,”C++”,”Java”));
|
クラスの静的メソッドとは異なり、インターフェイスの静的メソッドは継承されないため、実装クラスやインターフェイス型のインスタンスを介して呼び出すことはできないことに注意してください。
Guava
Guavaは、リストインスタンスに関連するいくつかの静的ユーティリティメソッドも提供します。,
JavaでGuavaを使用してリストを初期化する
Apache Commons Collections
Apache Commons CollectionsListUtils
クラスは、指定されたリストに裏打ちされた変更不可能なリストを返します。unmodifiableList()
これは、指定されたリストに裏打ちされた変更不可能なリストを返します。 指定されたリストがnullの場合はNullPointerException
をスローし、変更操作が実行された場合はUnsupportedOperationException
をスローします。