Вопрос по java, is-empty, collections – Проверка, является ли коллекция пустой в Java: какой метод лучше?

60

У меня есть два способа проверить, пуст ли список или нет

if (CollectionUtils.isNotEmpty(listName)) 

а также

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

Моя арка говорит мне, что первое лучше, чем второе. Но я думаю, что последний лучше.

Может кто-нибудь уточнить, пожалуйста?

Привет ... Я единственный, кто видит в этом разборчивость? Первый, очевидно, лучше сделать код более читабельным. Какое предложение делает васthink less при чтении, разрешение двух операций в сочетании сand или просто чтениеisNotEmpty ?? Мы можем долго говорить о преимуществах производительности последнего, но из-за ошибки, первая гораздо надежнее. coya
почему вы думаете "последнее"? лучше? ant
Я думаю, что личный вкус имеет способ в этом. CollectionUtils делает 2 вещи за один вызов, поэтому вам, как разработчику, легче. Последнее дает вам, как разработчику, немного больше работы, однако вы сохраняете на компьютере толчок ссылки на коллекцию в стеке, и весь стек работает вокруг него. По производительности последний будет немного быстрее. Не то чтобы вы это заметили. Lawrence
Почему бы и нетlistname.isEmpty() ? isEmpty это метод в интерфейсе коллекции ccheneson
Интерфейс коллекции предоставляет метод isEmpty () для пустой проверки. Оба способа лучше использовать любой по выбору. bNd

Ваш Ответ

11   ответов
0

Я бы использовал первый. Понятно сразу увидеть, что он делает. Я не думаю, что проверка нуля необходима здесь.

2

Apache Commons & apos; CollectionUtils.isNotEmpty (Collection) является проверкой NULL-SAFE

Возвращает TRUE, если Коллекция / Список не пустые и не нулевые Возвращает FALSE, если коллекция пуста

Пример:

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)

10

Если вы уже не используете CollectionUtils, я бы пошел наList.isEmpty()меньше зависимостей.

Мудрая производительность CollectionUtils будет немного медленнее. Потому что это в основном следует той же логике, но имеет дополнительные накладные расходы.

Так что это будет удобочитаемость, производительность и зависимость. Не большая разница, хотя.

20 лет в качестве разработчика и привычка использовать CollectionUtils сделали меня ленивым. Даже не заметил стандартную List.isEmpty ()! Никогда не слишком стар, чтобы учиться. Спасибо чувак! Я изменю это отношение мое :-D
List.isEmpty () отличается от CollectionUtils.isEmpty ()! Последний будет обрабатывать случай, когда коллекция равна нулю, первый будет выбрасывать NPE.
121

Вам следуетabsolutely использованиеisEmpty(), Вычислениеsize() произвольного списка может быть дорогим. Даже проверяя, есть ли у него какие-либо элементыcan конечно, дорого, но для оптимизации нетsize() которые не могутalso делатьisEmpty() быстрее, тогда как обратное не так.

Например, предположим, что у вас есть структура связанного списка, котораяdidn't размер кэша (тогда какLinkedList<E> does). затемsize() станет операцией O (N), тогда какisEmpty() все равно будетO(1).

Кроме того, конечно, используяisEmpty() более четко излагает то, что вас на самом деле интересует.

Реализация LinkedListsisEmpty какreturn size() == 0;, хоть.
@ user3932000: Конечно, я ожидаю, что это будет иметь место для любой реализации, котораяdoes узнать размер дешево
В то время какList.size()==0 противList.isEmpty() аргумент производительности верен, это не отвечает на вопрос об использовании Apache commons-collectionCollectionUtils.isEmpty или жеCollectionUtils.isNotEmpty()
0
isEmpty()

      Returns true if this list contains no elements.

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

-1

Чтобы проверить, что коллекция пуста, вы можете использовать метод: .count (). Пример:

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

Хорошим примером того, где это имеет значение на практике, являетсяConcurrentSkipListSet implementation в JDK, который гласит:

Beware that, unlike in most collections, the size method is not a constant-time operation.

Это явный случай, когдаisEmpty() гораздо эффективнее, чем проверка того,size()==0.

Вы можете понять, почему, интуитивно, это может иметь место в некоторых коллекциях. Если это такая структура, где вам нужно пройти через все это для подсчета элементов, тогда, если все, что вам нужно знать, это то, пусто ли оно, вы можете остановиться, как только найдете первое.

7

if (CollectionUtils.isNotEmpty(listName))

Такой же как:

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

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

6

Если в вашем проекте есть общие утилиты Apache, лучше используйте первую. Потому что он короче и делает точно так же, как последний. Между обоими методами не будет никакой разницы, кроме как она выглядит внутри исходного кода.

Также пустой чек с помощью

listName.size() != 0

Не рекомендуется, потому что все реализации коллекции имеют

listName.isEmpty()

функция, которая делает то же самое.

В общем, если у вас есть общие утилиты Apache в вашем classpath, используйте

if (CollectionUtils.isNotEmpty(listName)) 

в любом другом случае использования

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

Вы не заметите никакой разницы в производительности. Обе строки делают точно так же.

Есть коллекции, гдеsize() метод O (n). Обычно ожидается, что всеisEmpty() реализации будут O (1).
1

использованиеCollectionUtils.isEmpty(Collection coll)

Нулевая безопасная проверка, если указанная коллекция пуста. Null возвращает истину.

Parameters: coll - коллекция для проверки, может быть нулевой

Returns: истина, если пусто или ноль

50

CollectionUtils.isNotEmpty проверяет, является ли ваша коллекция не пустой и не пустой Это лучше по сравнению с двойной проверкой, но только если у вас есть эта библиотека Apache в вашем проекте. Если вы не используете, тогда используйте:

if(list != null && !list.isEmpty())
Другое преимущество использования Apache commons-collectionCollectionUtils.isEmpty (или жеCollectionUtils.isNotEmpty) Это твоеif условие имеет меньше ветвей, поэтому в ваших тестах легче достичь хорошего покрытия ветвлений. Например, Sonarqube сообщает о 75% охвате в лучшем случае дляif (list==null || list.isEmpty()) потому что вы не можете иметь список, который является нулевым и не пустым одновременно.

Похожие вопросы