Перевірка, чи колекція порожня в Java: який найкращий метод?


77

У мене є два способи перевірити, чи є список порожнім чи ні

if (CollectionUtils.isNotEmpty(listName)) 

і

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

Моя арка говорить мені, що перше краще, ніж друге. Але я думаю, що останнє краще.

Хто-небудь може це пояснити?


2
чому ви вважаєте, що "останнє" краще?
мураха

3
Чому ні listname.isEmpty()? isEmptyє методом в інтерфейсі колекції
ccheneson

1
Інтерфейс збору надає метод isEmpty () для порожньої перевірки. обидва шляхи краще, і ви можете піти з будь-яким із них на вибір.
bd

1
Я думаю, що особистий смак має в цьому певний шлях. CollectionUtils робить дві речі за один дзвінок, тому вам як розробнику легше. Останнє дає вам як розробнику трохи більше роботи, однак ви зберігаєте комп'ютер, натискаючи посилання колекції на стек, і весь стек працює навколо нього. З точки зору продуктивності, остання буде трохи швидшою. Не те щоб ви помітили.
Лоуренс

1
Привіт ... чи я єдиний бачу це як питання розбірливості? Перший, очевидно, кращий для того, щоб зробити код більш розбірливим. Яке речення змушує вас менше думати, читаючи, що роздільна здатність двох операцій у поєднанні з та чи просто читанням isNotEmpty ?? Ми можемо довго говорити про переваги останньої в продуктивності, але, як результат помилки, перша є набагато надійнішою.
Коя

Відповіді:


139

Ви повинні абсолютно використовувати isEmpty(). Обчислення size()довільного списку може бути дорогим. Звичайно, навіть перевірка того, чи є в ньому якісь елементи, може бути дорогою, але немає жодної оптимізації, size()яка також не може зробити isEmpty()швидшою, тоді як навпаки це не так.

Наприклад, припустимо, у вас була пов’язана структура списку, яка не кешувала розмір (тоді як LinkedList<E> це робить ). Тоді size()це стане операцією O (N), тоді як isEmpty()все ще буде O(1).

До того ж, звичайно, використання isEmpty()чіткіше визначає те, що насправді вас цікавить.


Хоча аргумент List.size()==0проти List.isEmpty()ефективності правильний, це не відповідає на запитання щодо використання спільних колекцій Apache CollectionUtils.isEmptyабоCollectionUtils.isNotEmpty()
Джульєн Кронегг

Однак LinkedLists реалізують isEmptyяк return size() == 0;.
user3932000

@ user3932000: Звичайно, я сподівався б, що це має місце для будь-якої реалізації, яка знає розмір дешево
Джон Скіт,

60

CollectionUtils.isNotEmptyперевіряє, чи не є ваша колекція нульовою та не порожньою. Це краще порівняти з подвійною перевіркою, але лише якщо у вашому проекті є ця бібліотека Apache. Якщо ви цього не зробите, використовуйте:

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

4
Іншою перевагою використання спільних колекцій Apache CollectionUtils.isEmpty(або CollectionUtils.isNotEmpty) є те, що у вашому ifстані менше гілок, тому легше досягти хорошого охоплення філій у ваших тестах. Наприклад, Sonarqube повідомляє про покриття 75%, в кращому випадку, if (list==null || list.isEmpty())оскільки ви не можете мати список, який є нульовим і не порожнім одночасно.
Julien Kronegg

12

Якщо ви вже не використовуєте CollectionUtils, на який я б пішов List.isEmpty(), менше залежностей.

Показники ефективності CollectionUtils будуть трохи повільнішими. Тому що він в основному слідує тій же логіці, але має додаткові накладні витрати.

Тож це буде читабельність у порівнянні з продуктивністю та залежностями. Не багато великої різниці, хоча.


20 років розробника та звичка використовувати CollectionUtils змусили мене лінуватися. Навіть не помітив стандартного List.isEmpty ()! Ніколи не занадто старий, щоб вчитися. Дякую людино! Я зміню цей мій апетит :-D
Лоуренс

12
List.isEmpty () - це не те саме, що CollectionUtils.isEmpty ()! Останній обробляє випадок, коли колекція нульова, перша видає NPE.
Starkii

11

if (CollectionUtils.isNotEmpty(listName))

Це те саме, що:

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

У першому підході listNameможе бути нуль, і виняток нульового покажчика не буде викинуто. При другому підході вам потрібно перевірити наявність нуля вручну. Перший підхід кращий, оскільки він вимагає від вас менше роботи. Використання .size() != 0- це взагалі щось непотрібне, я також дізнався, що це повільніше, ніж використання.isEmpty()


7

Якщо у вашому проекті є загальні утиліти Apache, скоріше використовуйте першу. Тому що він коротший і робить точно так само, як останній. Не буде різниці між обома методами, але як це виглядає всередині вихідного коду.

Також порожній чек за допомогою

listName.size() != 0

Не рекомендується, оскільки всі реалізації колекції мають

listName.isEmpty()

функція, яка робить точно те ж саме.

Отже, якщо у вас і так є загальні утиліти Apache у вашому класі, використовуйте

if (CollectionUtils.isNotEmpty(listName)) 

у будь-якому іншому випадку використовувати

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

Ви не помітите жодної різниці в продуктивності. Обидва рядки роблять абсолютно однаково.


1
Є колекції, де size()метод - O (n). Зазвичай очікується, що всі isEmpty()реалізації будуть O (1).
Mike Duigou

3

Колекція Apache Commons 'CollectionUtils.isNotEmpty (Колекція) - це ПЕРЕВІРНА БЕЗПЕКА

Повертає TRUE - це колекція / Список не є порожнім та не-null Повертає FALSE, якщо колекція має значення Null

Приклад:

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

Посилання: https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#isNotEmpty(java.util.Collection)


1

Хорошим прикладом того, де це має значення на практиці, є ConcurrentSkipListSetреалізація в JDK, де сказано:

Пам'ятайте, що, на відміну від більшості колекцій, метод розміру не є операцією з постійним часом.

Це явний випадок, коли isEmpty()набагато ефективніше, ніж перевірка size()==0.

Ви можете зрозуміти, чому інтуїтивно це може бути у деяких колекціях. Якщо це така структура, де вам потрібно пройти всю справу, щоб підрахувати елементи, то якщо все, що ви хочете знати, це чи вона порожня, ви можете зупинитися, як тільки знайдете перший.


1

Використовуйте CollectionUtils.isEmpty (збір колекції)

Нульова безпека перевірки, чи вказана колекція порожня. Null повертає true.

Параметри: coll - колекція для перевірки, може бути нульовою

Повертає: істина, якщо порожня або нульова



0

Я б використав перший. Зрозуміло відразу, що це робить. Я не думаю, що тут необхідна перевірка на нуль.


-6

Щоб перевірити колекцію порожньою, можна скористатися методом: .count (). Приклад:

DBCollection collection = mMongoOperation.getCollection("sequence");
    if(collection.count() == 0) {
        SequenceId sequenceId = new SequenceId("id", 0);
        mMongoOperation.save(sequenceId);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.