265

実際には、次のような空のリストを返す方が良いです:

return Collections.emptyList();

またはこのように:

return new ArrayList<Foo>();

それとも、返されたリストで何をしようとしているかに完全に依存していますか?

4

7 に答える 7

325

主な違いは、不変リスト、つまり要素を追加できないリストをCollections.emptyList()返すことです。( Java 9 で導入された も同様です。)List.of()

まれに、返されたリストを変更する必要があり、適切な選択ではない場合があります。Collections.emptyList()List.of()

不変リストを返すことは、コントラクト (ドキュメント) が明示的に別の方法で述べていない限り、まったく問題ありません (そして好ましい方法でさえあります)。


さらに、emptyList() 各呼び出しで新しいオブジェクトを作成しない場合があります。

このメソッドの実装では、呼び出しごとに個別の List オブジェクトを作成する必要はありません。この方法を使用すると、同じ名前のフィールドを使用する場合と同等のコストがかかる可能性があります。(このメソッドとは異なり、フィールドはタイプ セーフを提供しません。)

の実装はemptyList次のようになります。

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

そのため、(空のリストを返す) メソッドが頻繁に呼び出される場合、このアプローチにより、CPU とメモリの両方のパフォーマンスがわずかに向上する可能性があります。

于 2011-04-05T13:04:18.943 に答える
55

Java 5.0 以降では、コンテナ内の要素のタイプを指定できます。

Collections.<Foo>emptyList()

空のままの空のリストを返したい場合は、このアプローチを使用する必要があるという他の回答に同意します。

于 2011-10-13T17:44:00.440 に答える
30

Collections.emptyListは不変であるため、2 つのバージョンには違いがあるため、戻り値のユーザーを考慮する必要があります。

戻るnew ArrayList<Foo>と常にオブジェクトの新しいインスタンスが作成されるため、それに関連する非常にわずかな追加コストが発生するため、 を使用する理由になる場合がありますCollections.emptyList。読みやすいという理由だけで使用するのが好きemptyListです。

于 2011-04-05T13:03:47.297 に答える
18

ただし、注意してください。戻って、そのような変更を加えよCollections.emptyList()うとすると、変更できないオブジェクトが返されるため、不変オブジェクトが返されます。add()UnsupportedOperationException()Collections.emptyList()

于 2016-07-06T06:36:47.883 に答える
8

返されたリストが変更されていないCollections.emptyList()場合 (リストは不変であるため)、それ以外の場合はオプション 2 を使用します。

の利点Collections.emptyList()は、毎回同じ静的インスタンスが返されるため、呼び出しごとにインスタンスが作成されないことです。

于 2011-04-05T13:07:33.810 に答える
3

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 からのソース)

于 2016-02-15T07:42:07.853 に答える
3

Collections.emptyList()返されたリストが変更されないようにする場合に使用します。

これは、呼び出し時に返されるものですemptyList():

/**
 * The empty list (immutable). 
 */
public static final List EMPTY_LIST = new EmptyList();
于 2012-04-24T08:43:04.967 に答える