Проверка, пуста ли коллекция в Java: какой лучший метод?

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

if (CollectionUtils.isNotEmpty(listName)) 

и

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

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

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

11 ответов


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

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

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


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

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

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

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

Так было бы читаемость показателей и зависимостей между. Впрочем, не такая уж большая разница.


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

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

listName.size() != 0

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

listName.isEmpty()

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

Итак, в целом, если у вас есть Apache common utils в вашем пути к классам в любом случае, используйте

if (CollectionUtils.isNotEmpty(listName)) 

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

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

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


if (CollectionUtils.isNotEmpty(listName))

- это то же, что:

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

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


Apache Commons' CollectionUtils.isNotEmpty (Collection) является нулевой безопасной проверкой

возвращает 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)


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

остерегайтесь, что, в отличие от большинства коллекций, метод size не является операцией постоянного времени.

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

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


isEmpty()

      Returns true if this list contains no elements.

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


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


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

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

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

Null-safe проверьте, пуста ли указанная коллекция. Null возвращает true.

параметры: coll-коллекция для проверки, может быть null

возвращает: true, если пусто или null