Проверка, является ли коллекция пустой в Java: какой метод лучше?
У меня есть два способа проверить, пуст ли список или нет
if (CollectionUtils.isNotEmpty(listName))
а также
if (listName != null && listName.size() != 0)
Моя арка говорит мне, что первое лучше, чем второе. Но я думаю, что последний лучше.
Может кто-нибудь уточнить, пожалуйста?
Ответы
Ответ 1
Вы должны абсолютно использовать isEmpty()
. Вычисление size()
произвольного списка может быть дорогостоящим. Конечно, даже проверка того, имеет ли он какие-либо элементы, может быть дорогостоящей, но нет оптимизации для size()
, которая также не может сделать isEmpty()
быстрее, тогда как обратное не так.
Например, предположим, что у вас есть связанная структура списка, которая не кэшировала размер (тогда как LinkedList<E>
делает). Тогда size()
станет операцией O (N), тогда как isEmpty()
будет O(1)
.
Кроме того, конечно, использование isEmpty()
указывает на то, что вы действительно заинтересованы более четко.
Ответ 2
CollectionUtils.isNotEmpty
проверяет, не является ли ваша коллекция пустой, а не пустой. Это лучше сравнить с двойной проверкой, но только если у вас есть эта библиотека Apache в вашем проекте. Если вы этого не сделаете, используйте:
if(list != null && !list.isEmpty())
Ответ 3
Если вы уже используете CollectionUtils, я бы пошел на List.isEmpty()
, меньше зависимостей.
Производительность будет более медленной. Поскольку он в основном следует той же логике, но имеет дополнительные накладные расходы.
Таким образом, это будет читабельность против производительности и зависимостей. Однако не большая разница.
Ответ 4
if (CollectionUtils.isNotEmpty(listName))
То же, что и:
if(listName != null && !listName.isEmpty())
В первом подходе listName
может быть null и исключение null-указателя не будет выбрано. Во втором подходе вам нужно проверить значение null вручную. Первый подход лучше, потому что он требует от вас меньше работы. Использование .size() != 0
- это что-то ненужное, также я узнал, что он медленнее, чем использование .isEmpty()
Ответ 5
Если у вас есть общие утилиты Apache в вашем проекте, используйте первый. Потому что он короче и точно такой же, как и последний. Между этими методами не будет никакой разницы, но как это выглядит внутри исходного кода.
Также пустая проверка с использованием
listName.size() != 0
Не рекомендуется, потому что все реализации коллекции имеют
listName.isEmpty()
которая делает то же самое.
Итак, в общем, если у вас есть общие утилиты Apache в вашем пути к классам, используйте
if (CollectionUtils.isNotEmpty(listName))
в любом другом случае используйте
if(listName != null && listName.isEmpty())
Вы не заметите разницы в производительности. Обе строки делают то же самое.
Ответ 6
Коллекция коллекций ApacheUtils.isNotEmpty(коллекция) - это проверка NULL-SAFE
Возвращает 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)
Ответ 7
Хорошим примером того, что это на практике, является ConcurrentSkipListSet
реализация в JDK, в котором говорится:
Остерегайтесь того, что в отличие от большинства коллекций метод размера не является операцией с постоянным временем.
Это явный случай, когда isEmpty()
намного эффективнее проверки size()==0
.
Вы можете понять, почему, интуитивно, это может иметь место в некоторых коллекциях. Если это своего рода структура, в которой вам нужно пройти все это, чтобы подсчитать элементы, тогда, если все, что вы хотите знать, будет ли оно пустым, вы можете остановить, как только вы найдете первый.
Ответ 8
Используйте CollectionUtils.isEmpty(Collection coll)
Нулевая проверка, если указанная коллекция пуста.
Null возвращает true.
Параметры:
coll - сбор для проверки, может быть null
Возврат:
true, если пусто или null
Ответ 9
isEmpty()
Returns true if this list contains no elements.
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html
Ответ 10
Я бы использовал первый. Ясно сразу видеть, что он делает. Я не думаю, что здесь нужна нулевая проверка.
Ответ 11
Проверить коллекцию пуст, вы можете использовать метод:.count(). Пример:
DBCollection collection = mMongoOperation.getCollection("sequence");
if(collection.count() == 0) {
SequenceId sequenceId = new SequenceId("id", 0);
mMongoOperation.save(sequenceId);
}