回答:
主な違いはCollections.emptyList()
、不変のリスト、つまり要素を追加できないリストを返すことです。(List.of()
Java 9で導入されたものと同じです。)
あなたはまれなケースではない返されたリストを変更したい、Collections.emptyList()
とList.of()
このようにしているではない良い選択。
不変のリストを返すことは、コントラクト(ドキュメント)が明確に異なる状態を示さない限り、完全に(そして推奨される方法でも)良いと思います。
さらに、emptyList()
呼び出しごとに新しいオブジェクトを作成しない場合があります。
このメソッドの実装では、呼び出しごとに個別のListオブジェクトを作成する必要はありません。この方法を使用すると、同じ名前のフィールドを使用する場合と同等のコストがかかる可能性があります。(このメソッドとは異なり、このフィールドはタイプセーフを提供しません。)
の実装はemptyList
次のようになります。
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
したがって、メソッド(空のリストを返す)が頻繁に呼び出される場合、このアプローチでは、CPUとメモリの両方のパフォーマンスがわずかに向上する可能性があります。
NullPointerException
戻ることによって取得しません。Collections.emptyList()
null
Collections.emptyList()
反復可能で長さを返すため、例外をスローすることなくforループで使用できます。
new ArrayList<>()
それと比較すると、設計の決定が明確になります。要素はこのリストに追加されません。
返されたリストが変更されないようにする場合は、Collections.emptyList()を使用します。emptyList()を呼び出すと、以下が返されます。
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
Collections.emptyList()
建設費がかかっているかどうかを調べようとしてここに到着しました。実装の詳細を確認すると(おそらくすべてのJVMで同じではありません)、そうではないことが確認されます。@Atul、これはどのJVMからのものですか?
与えられた答えemptyList()
は、不変を返すList
が代替を与えないという事実を強調します。コンストラクタはArrayList(int initialCapacity)
特別なケースな0
ので、new ArrayList<>(0)
代わりに返すnew ArrayList<>()
ことも実行可能な解決策かもしれません:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(Java 1.8.0_72からのソース)
Collections.emptyList()
たとえばエラーチェックなどにもっと適していますか?