5

ArrayList、hashmap などのコレクションを使用します。

リストが null かどうかなどの条件をチェックした回数。

コレクションが null かどうかを確認する方法はたくさんあります。

違う方法。

1. if(list==null)
2. if(list.size()==0)
3. if(list.isEmpty())

また、 list が null でないかどうかを確認する必要がある場合もあるため、通常はこれらの方法で確認します

1. if(list!=null)
2. if(list.size()>0)
3. if(!list.isEmpty()) 

プログラム実行のパフォーマンスを考慮して、どちらが最適な条件であるか、またはこれらの組み合わせを作成する必要がありますか?

4

11 に答える 11

9

ベストな組み合わせは

if(list!=null && !list.isEmpty()){

        //Yeah ,do something
}

1つはnullチェック用、次にそこにあるかどうかをチェックするもの

于 2013-10-10T11:04:21.813 に答える
6
1. if(list!=null)

決してそうではないことを確認する必要があります!!

Joshua Bloch による「Effective Java 2nd Edition」を読む
項目 43: null ではなく、空の配列またはコレクションを返す

[...] 要約すると、空の配列またはコレクションを返す代わりに、配列値またはコレクション値のメソッドから null を返す理由はありません。null を返すイディオムは、配列の長さが実際の配列とは別に返される C プログラミング言語から引き継がれている可能性があります。C では、長さとしてゼロが返される場合、配列を割り当てても利点はありません。

つまり、メソッドCollections.emptyList()が null の代わりに返されるようにすれば、心配することが 1 つ少なくなります。

2. if(list.size()>0)
3. if(!list.isEmpty()) 

場合によります。ArrayList などの単純なコレクションの場合、これらは同等です。しかし、コレクションが実際にデータベース クエリのライブ ビューである場合はどうでしょうか。isEmpty() は常に O(1) になりますが、size() の呼び出しは非常にコストのかかる操作になる可能性があります。isEmpty() を使用すると思います。

Jon Skeet の回答も参照してください: https://stackoverflow.com/a/11152624/342852

于 2013-10-10T11:08:55.030 に答える
3

Java8 ではOptionalを使用して null ケースを適切に処理できます。たとえば、両方のリストanimalsNullanimalWithNullElements関数によって適切に処理されますfilterList

List<String> animalsNull = null;

List<String> animalWithNullElements = new ArrayList<String>();
        animalWithNullElements.add(0, null);
        animalWithNullElements.add(1, "Guybrush Threepwood");
        animalWithNullElements.add(2, null);

private static List<String> filterList(List<String> animals) {
        return Optional.ofNullable(animals)
               .orElseGet(Collections::emptyList)
               .stream()
               .filter(Objects::nonNull)
               .collect(Collectors.toList());
    }
于 2016-08-29T14:54:52.687 に答える
2

リストが null かどうかなどの条件をチェックした回数。

まず、nullコレクションと空のコレクションは別物です。コレクションが空かどうかをテストするnull必要がある場合は、別のテストが必要です。

第 2 に、コレクションがどちらかnullまたは空である可能性がある場合 (アプリケーションの設計によって、それらは同じことを「意味」します)、設計に問題があります。ほとんどの場合、表現しようとしているものは何でも表現する必要があります... どちらかまたは両方ではなく、一方向です。

第 3 に、通常は ではなく空のコレクションを使用することをお勧めします。これは、空のコレクションnullと空でないコレクションを一様に扱うことができるためです。対照的に、 a はnull 常に特殊なケースとして処理する必要があります。(そして、ケースを処理するのを忘れたnull場合、可能性がありNullPointerExceptionsます。)


そうは言っても ...

プログラム実行のパフォーマンスを考慮して、どちらが最適な条件であるか、またはこれらの組み合わせを作成する必要がありますか?

本当に a のケースに対処する必要がある場合は、nullをテストするしかありませんnull

isEmpty()対の場合size() == 0:

  • 2 つの述語は同じ答えを返すはずです (無限の遅延コレクションがない限り...)。

  • 場合によっては、少なくとも理論的には高速になるisEmpty() 可能性があります。

後者は、コレクション型の実装に依存します。具体的には、メソッドがコレクション要素をカウントsize()する必要があるかどうかに依存します。(標準のコレクション クラスのいずれにもこのプロパティがあるとは思いませんが、そうするクラスが見つからないというわけではありません ...)

したがって、最適な述語は次のいずれかです。

 c != null && !c.isEmpty()

また

 !c.isEmpty()

(本当に)ヌルに対応する必要があるかどうかによって異なります。

そして当然の帰結として、空のコレクションを表すために を使用しない場合、アプリケーションはより効率的であるだけでなく、よりシンプルで堅牢になる可能性が高いということです。null(不変の空のコレクション オブジェクトが必要な場合は、Collectionsクラスで定義されたメソッド/静的から無料で取得できます。)

于 2013-10-10T11:21:38.727 に答える
2

それは本当にあなたが何をしたいかによって異なります。リストが存在し、いくつかの要素があることを確認したい場合は、次を使用します

if (list != null && !list.isEmpty())

コレクションを返すとき、デフォルトで空のコレクションを返します。そうすれば、ヌルを回避できます。

于 2013-10-10T11:06:36.527 に答える
0

これを処理するには、複数の方法があります。

null1: コードが、コンストラクターまたはフィールドの初期化としてコレクションを初期化できないことを確認する場合、呼び出し元は理想的にはnullどこでもチェックする必要はありません。isEmptyチェックだけで十分です:

private List<Integer> numbers = new ArrayList<Integer>(); //or in constructor

// 呼び出し元は安全に使用できます

if(numbers.isEmpty)

null2: あるいは、持ってチェックするユーティリティ メソッドを記述します。コール内で既に行われているemptyため、チェックの必要はありません。このユーティリティ メソッドは、コードの他の場所で使用します。sizeisEmpty

public static boolean empty(Collection<?> col) {
   return col == null || col.isEmpty();
}
于 2013-10-10T11:05:53.230 に答える
0

null手段listは null で初期化されます。nullリストsizeまたはisEmptyスローしNullPointerExceptionます。ただし、nulllistを空にすることも、size==0 にすることもできません

(list!=null) != (list.size()==0)

size==0 と isEmpty は同等です。

(list.size()==0) ==  list.isEmpty()
于 2013-10-10T11:04:20.163 に答える
0

プログラムの構造によって異なります。たとえば、ArrayUtils次のような API を持つ というヘルパー クラスがあります。

public static <E> boolean isEmpty(final Collection<E> collection)
{
    return collection == null || collection.isEmpty();
}

リストを取得できることがわかっている場合はこれを使用しますnullが、そうではないことが絶対に確実な場合はnull、のみを使用しますif ( collection.isEmpty )。コードの可読性も向上します。

collection.size() > 1他の API を自由に使用できるため、冗長です。

于 2013-10-10T11:06:16.203 に答える
0

以下のように2つの述語でそれを行うことができます:

public static final Predicate<String> NULL_OR_EMPTY = (in) -> null == in || "".equals(in);

public static final Predicate<List<String>> STRING_LIST_NULL_OR_EMPTY = (strList) ->  strList.stream().filter(NULL_OR_EMPTY).collect(Collectors.toList()).size() > 0;
于 2018-08-07T10:20:56.013 に答える