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

Lesezeit: 5 Minuten

Benutzer-Avatar
Vikrant

Ich habe zwei Möglichkeiten zu prü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 letzteres finde ich besser.

Kann es jemand bitte klären?

  • warum ist “letzteres” besser?

    – Ameise

    22. Juni 2012 um 8:18 Uhr

  • Warum nicht listname.isEmpty() ? isEmpty ist eine Methode in der Collection-Schnittstelle

    – ccheneson

    22. Juni 2012 um 8:19 Uhr


  • Die Sammlungsschnittstelle bietet die Methode isEmpty () für leere Prüfungen. Beide Möglichkeiten sind besser. Sie können mit jeder nach Wahl gehen.

    – bNd

    22. Juni 2012 um 8:45 Uhr

  • Ich denke, der persönliche Geschmack spielt dabei eine Rolle. CollectionUtils erledigt zwei Dinge in einem Aufruf, damit es für Sie als Entwickler einfacher ist. Letzteres gibt Ihnen als Entwickler etwas mehr Arbeit, aber Sie ersparen dem Computer einen Push der Sammlungsreferenz auf den Stack und der gesamte Stack arbeitet darum herum. Letzteres wird leistungsmäßig etwas schneller sein. Nicht, dass Sie es bemerken würden.

    – Laurentius

    24. März 2015 um 10:00 Uhr

  • Hallo… bin ich der einzige, der das aus Gründen der Lesbarkeit sieht? Der erste ist offensichtlich besser, um den Code besser lesbar zu machen. Welcher Satz macht dich Denk weniger beim Lesen, die Auflösung von zwei Operationen kombiniert mit einer und oder einfach lesen ist nicht leer ?? Wir können lange über die Leistungsvorteile des letzteren sprechen, aber in Bezug auf die Fehleranfälligkeit ist ersterer viel robuster.

    – Koya

    30. November 2016 um 11:47 Uhr

Benutzer-Avatar
Jon Skeet

Du solltest unbedingt verwenden isEmpty(). Berechnung der size() einer beliebigen Liste teuer werden könnte. Es wird sogar überprüft, ob es Elemente enthält kann natürlich teuer sein, aber dafür gibt es keine Optimierung size() was nicht kann Auch machen isEmpty() schneller, während das Gegenteil nicht der Fall ist.

Angenommen, Sie hätten eine verkettete Listenstruktur, die nicht Cache die Größe (während LinkedList<E> tut). Dann size() zu einer O(N)-Operation werden würde, wohingegen isEmpty() wäre es noch O(1).

Zusätzlich natürlich mit isEmpty() deutlicher ausdrückt, woran Sie eigentlich interessiert sind.

  • Während List.size()==0 vs List.isEmpty() Performance-Argument richtig ist, beantwortet dies nicht die Frage nach der Verwendung von Apache Commons-Collections CollectionUtils.isEmpty oder CollectionUtils.isNotEmpty()

    – Julien Kronegg

    12. Dezember 2018 um 14:17 Uhr

  • LinkedLists implementieren isEmpty wie return size() == 0;obwohl.

    – Benutzer3932000

    16. Dezember 2018 um 18:17 Uhr

  • @ user3932000: Sicher, ich würde erwarten, dass dies bei jeder Implementierung der Fall ist tut Kennen Sie die Größe auf billige Weise

    – Jon Skeet

    16. Dezember 2018 um 19:26 Uhr

Benutzer-Avatar
alexey28

CollectionUtils.isNotEmpty überprüft, ob Ihre Sammlung nicht null und nicht leer ist. Dies ist im Vergleich zur doppelten Überprüfung besser, aber nur, wenn Sie diese Apache-Bibliothek in Ihrem Projekt haben. Wenn Sie dies nicht tun, verwenden Sie:

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

  • Der andere Vorteil der Verwendung von Apache Commons-Sammlungen CollectionUtils.isEmpty (oder CollectionUtils.isNotEmpty) ist das dein if Bedingung hat weniger Verzweigungen, sodass es einfacher ist, in Ihren Tests eine gute Verzweigungsabdeckung zu erreichen. Beispielsweise meldet Sonarqube bestenfalls eine Abdeckung von 75 % if (list==null || list.isEmpty()) weil Sie keine Liste haben können, die gleichzeitig null und nicht leer ist.

    – Julien Kronegg

    12. Dezember 2018 um 14:13 Uhr

  • @JulienKronegg Ich glaube nicht, dass ich damit einverstanden bin. list == null und list.isEmpty() sind zwei verschiedene Anwendungsfälle und wir sollten Testfälle für jede Bedingung definieren. Ein Testfall sollte den Fall auswerten, wenn die Liste null ist, und ein anderer sollte den Fall auswerten, wenn die Liste null ist nicht null aber leer. Nur das Erreichen der Abdeckung ist nicht die wahre Absicht von Unit-Tests.

    – Agam

    2. März um 1:10

Benutzer-Avatar
aaa

Es sei denn, Sie verwenden bereits CollectionUtils, für die ich mich entscheiden würde List.isEmpty()weniger Abhängigkeiten.

Leistungsmäßig wird CollectionUtils etwas langsamer sein. Weil es im Grunde der gleichen Logik folgt, aber zusätzlichen Overhead hat.

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

  • 20 Jahre als Entwickler und die Gewohnheit, CollectionUtils zu verwenden, haben mich faul gemacht. Ich habe nicht einmal die standardmäßige List.isEmpty() bemerkt! Niemals zu alt zum Lernen. Danke, Mann! Ich werde diese Einstellung von mir ändern 😀

    – Laurentius

    24. März 2015 um 10:02 Uhr

  • List.isEmpty() ist nicht dasselbe wie CollectionUtils.isEmpty()! Letztere behandelt den Fall, in dem die Sammlung null ist, erstere wirft eine NPE.

    – Starkii

    27. Mai 2015 um 13:50 Uhr


if (CollectionUtils.isNotEmpty(listName))

Ist das gleiche wie:

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

Im ersten Ansatz listName kann null sein und eine Nullzeiger-Ausnahme wird nicht ausgelöst. Im zweiten Ansatz müssen Sie manuell nach null suchen. Der erste Ansatz ist besser, weil er weniger Arbeit von Ihnen erfordert. Verwenden .size() != 0 ist überhaupt etwas unnötiges, außerdem habe ich gelernt, dass es langsamer ist als die nutzung .isEmpty()

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

Auch ein leerer Scheck mit

listName.size() != 0

Es wird davon abgeraten, da alle Sammlungsimplementierungen die haben

listName.isEmpty()

Funktion, die genau dasselbe tut.

Also alles in allem, wenn Sie die allgemeinen Apache-Dienstprogramme sowieso in Ihrem Klassenpfad haben, verwenden Sie

if (CollectionUtils.isNotEmpty(listName)) 

in jedem anderen Fall verwenden

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

Sie werden keinen Leistungsunterschied bemerken. Beide Linien machen genau das Gleiche.

  • Es gibt Sammlungen, wo die size() Methode ist O(n). Es wird allgemein erwartet, dass alle isEmpty() Implementierungen werden O(1) sein.

    – Mike Duigou

    15. Februar 2014 um 0:26 Uhr

Benutzer-Avatar
Suren Konathala

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

Gibt TRUE zurück, wenn die Sammlung/Liste nicht leer ist, und not-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
}

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

  • Es gibt Sammlungen, wo die size() Methode ist O(n). Es wird allgemein erwartet, dass alle isEmpty() Implementierungen werden O(1) sein.

    – Mike Duigou

    15. Februar 2014 um 0:26 Uhr

Benutzer-Avatar
Benutzer278064

isEmpty()

      Returns true if this list contains no elements.

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html

1258150cookie-checkÜberprüfen, ob eine Sammlung in Java leer ist: Welches ist die beste Methode?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy