Überprüfen, ob eine Sammlung in Java leer ist: Welche Methode ist die beste?

76

Ich habe zwei Möglichkeiten zu überprüfen, ob eine Liste leer ist oder nicht

if (CollectionUtils.isNotEmpty(listName)) 

und

if (listName != null && listName.size() != 0)

Mein Bogen sagt mir, dass Ersteres besser ist als Letzteres. Aber ich denke, letzteres ist besser.

Kann jemand bitte klarstellen?

Vikrant
quelle
2
Warum denkst du, ist "Letzteres" besser?
Ameise
3
Warum nicht listname.isEmpty()? isEmptyist eine Methode in der Sammlung Schnittstelle
Ccheneson
1
Die Sammlungsschnittstelle bietet die Methode isEmpty () für leere Prüfungen. Beide Möglichkeiten sind besser. Sie können mit jeder Methode nach Wahl arbeiten.
bnd
1
Ich denke, persönlicher Geschmack hat einen Weg dazu. CollectionUtils erledigt zwei Dinge in einem Aufruf, so dass es für Sie als Entwickler einfacher ist. Letzteres gibt Ihnen als Entwickler etwas mehr Arbeit, Sie sparen dem Computer jedoch einen Druck auf die Sammlungsreferenz auf dem Stapel, und der gesamte Stapel arbeitet darum herum. In Bezug auf die Leistung wird letzteres etwas schneller sein. Nicht, dass du es bemerken würdest.
Lawrence
1
Hallo ... bin ich der einzige, der dies als eine Frage der Lesbarkeit ansieht? Der erste ist offensichtlich besser, um den Code besser lesbar zu machen. Welcher Satz lässt Sie beim Lesen weniger nachdenken , die Auflösung von zwei Operationen in Kombination mit einem und oder einfach nur Lesen ist nicht leer ? Wir können lange über die Leistungsvorteile des letzteren sprechen, aber aus Gründen der Fehleranfälligkeit ist das erstere viel robuster.
Coya

Antworten:

139

Sie sollten unbedingt verwenden isEmpty(). Das Berechnen size()einer beliebigen Liste kann teuer sein. Auch die Validierung , ob es irgendwelche Elemente hat können teuer sein, natürlich, aber es gibt keine Optimierung für size()welche nicht , kann auch machen isEmpty()schneller, während dies umgekehrt nicht der Fall ist.

Angenommen, Sie hatten eine verknüpfte Listenstruktur, die die Größe nicht zwischengespeichert hat (wohingegen dies der LinkedList<E> Fall ist ). Dann size()würde eine O (N) -Operation werden, während isEmpty()dies immer noch der Fall wäre O(1).

Darüber hinaus können Sie natürlich isEmpty()klarer angeben , woran Sie tatsächlich interessiert sind.

Jon Skeet
quelle
Während das Argument List.size()==0vs List.isEmpty()Performance korrekt ist, beantwortet dies nicht die Frage bezüglich der Verwendung von Apache Commons-Sammlungen CollectionUtils.isEmptyoderCollectionUtils.isNotEmpty()
Julien Kronegg
LinkedLists implementieren jedoch isEmptyals return size() == 0;.
Benutzer3932000
@ user3932000: Sicher, ich würde erwarten, dass dies für jede Implementierung der Fall ist, die die Größe auf billige Weise kennt
Jon Skeet
60

CollectionUtils.isNotEmptyprüft, ob Ihre Sammlung nicht null und nicht leer ist. Dies ist besser als eine doppelte Überprüfung, aber nur, wenn Sie diese Apache-Bibliothek in Ihrem Projekt haben. Wenn Sie dies nicht tun, verwenden Sie:

if(list != null && !list.isEmpty())
alexey28
quelle
4
Der andere Vorteil der Verwendung von Apache Commons-Sammlungen CollectionUtils.isEmpty(oder CollectionUtils.isNotEmpty) besteht darin, dass Ihre ifBedingung weniger Verzweigungen aufweist, sodass es einfacher ist, in Ihren Tests eine gute Verzweigungsabdeckung zu erreichen. Zum Beispiel meldet Sonarqube bestenfalls eine Abdeckung von 75%, if (list==null || list.isEmpty())weil Sie keine Liste haben können, die null und nicht gleichzeitig leer ist.
Julien Kronegg
12

Wenn Sie CollectionUtils nicht bereits verwenden, würde ich List.isEmpty()weniger Abhängigkeiten anstreben.

In Bezug auf die Leistung wird CollectionUtils etwas langsamer. Weil es im Grunde der gleichen Logik folgt, aber zusätzlichen Overhead hat.

Es wäre also Lesbarkeit vs. Leistung vs. Abhängigkeiten. Kein großer Unterschied.

aaa
quelle
20 Jahre als Entwickler und die Gewohnheit, CollectionUtils zu verwenden, haben mich faul gemacht. Ich habe nicht einmal die Standardliste List.isEmpty () bemerkt! Niemals zu alt zum Lernen. Danke, Mann! Ich werde meine Einstellung ändern :-D
Lawrence
12
List.isEmpty () ist nicht dasselbe wie CollectionUtils.isEmpty ()! Letzteres behandelt den Fall, dass die Sammlung null ist, Ersteres löst eine NPE aus.
Starkii
11

if (CollectionUtils.isNotEmpty(listName))

Ist das gleiche wie:

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

Im ersten Ansatz listNamekann null sein und eine Nullzeigerausnahme wird nicht ausgelöst. Im zweiten Ansatz müssen Sie manuell nach Null suchen. Der erste Ansatz ist besser, weil Sie weniger Arbeit benötigen. Verwenden .size() != 0ist überhaupt etwas Unnötiges, außerdem habe ich gelernt, dass es langsamer ist als Verwenden.isEmpty()

lxknvlk
quelle
7

Wenn Sie die allgemeinen Apache-Dienstprogramme in Ihrem Projekt haben, verwenden Sie lieber das erste. Weil es kürzer ist und genau das gleiche tut wie das letztere. Es wird keinen Unterschied zwischen beiden Methoden geben, aber wie es im Quellcode aussieht.

Auch ein leerer Scheck mit

listName.size() != 0

Wird davon abgeraten, da alle Sammlungsimplementierungen die

listName.isEmpty()

Funktion, die genau das gleiche tut.

Alles in allem sollten Sie also verwenden, wenn Sie die allgemeinen Apache-Dienstprogramme in Ihrem Klassenpfad haben

if (CollectionUtils.isNotEmpty(listName)) 

in jedem anderen Fall verwenden

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

Sie werden keinen Leistungsunterschied feststellen. Beide Zeilen machen genau das gleiche.

Nitram
quelle
1
Es gibt Sammlungen, in denen die size()Methode O (n) ist. Es wird allgemein erwartet, dass alle isEmpty()Implementierungen O (1) sein werden.
Mike Duigou
3

Die CollectionUtils.isNotEmpty (Collection) von Apache Commons ist eine NULL-SAFE-Prüfung

Rückgabe TRUE ist die Sammlung / Liste ist nicht leer und nicht null. Gibt FALSE zurück, wenn die Sammlung Null ist

Beispiel:

List<String> properties = new ArrayList();
...
if (CollectionUtils.isNotEmpty(properties)) {
  // process the list
} else {
 // list is null or empty
}

Siehe: https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#isNotEmpty(java.util.Collection)

Suren Konathala
quelle
1

Ein gutes Beispiel dafür, wo dies in der Praxis wichtig ist, ist die ConcurrentSkipListSetImplementierung im JDK, in der es heißt:

Beachten Sie, dass die Größenmethode im Gegensatz zu den meisten Sammlungen keine zeitkonstante Operation ist.

Dies ist ein klarer Fall, bei dem isEmpty()es viel effizienter ist, zu prüfen, ob size()==0.

Sie können intuitiv erkennen, warum dies in einigen Sammlungen der Fall sein kann. Wenn es sich um eine Struktur handelt, in der Sie das Ganze durchlaufen müssen, um die Elemente zu zählen, können Sie anhalten, sobald Sie die erste gefunden haben, wenn Sie nur wissen möchten, ob sie leer ist.

Chiastic-Sicherheit
quelle
1

Verwenden Sie CollectionUtils.isEmpty (Collection coll)

Nullsichere Prüfung, ob die angegebene Sammlung leer ist. Null gibt true zurück.

Parameter: coll - Die zu überprüfende Sammlung kann null sein

Rückgabe: true, wenn leer oder null

Asche
quelle
0

Ich würde den ersten benutzen. Es ist klar, sofort zu sehen, was es tut. Ich denke nicht, dass die Nullprüfung hier notwendig ist.

Zavior
quelle
-6

Um zu überprüfen, ob die Sammlung leer ist, können Sie die folgende Methode verwenden: .count (). Beispiel:

DBCollection collection = mMongoOperation.getCollection("sequence");
    if(collection.count() == 0) {
        SequenceId sequenceId = new SequenceId("id", 0);
        mMongoOperation.save(sequenceId);
    }
TVT. Jake
quelle