Looking for java Keywords? Try Ask4Keywords

Java Language Pitfall - использование параметра size () для проверки, является ли коллекция пустой, неэффективно.


пример

Рамка коллекций Java предоставляет два связанных метода для всех объектов Collection :

  • size() возвращает количество записей в Collection и
  • Метод isEmpty() возвращает true, если (и только если) Collection пуста.

Оба метода можно использовать для проверки пустоты коллекции. Например:

Collection<String> strings = new ArrayList<>();
boolean isEmpty_wrong = strings.size() == 0; // Avoid this
boolean isEmpty = strings.isEmpty();         // Best

Хотя эти подходы выглядят одинаково, некоторые реализации коллекции не сохраняют размер. Для такой коллекции реализация size() должна вычислять размер каждый раз, когда он вызывается. Например:

  • Простой класс связанного списка (но не java.util.LinkedList ), возможно, потребуется пройти через список для подсчета элементов.
  • Класс ConcurrentHashMap должен суммировать записи во всех «сегментах» карты.
  • Для ленивой реализации коллекции может потребоваться реализовать всю коллекцию в памяти, чтобы подсчитать элементы.

Напротив, метод isEmpty() должен только проверять, есть ли хотя бы один элемент в коллекции. Это не связано с подсчетом элементов.

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