4

В двух стилях ниже расположен объект Iterator. Полезно ли проверять, пуста ли коллекция до итерации? Я не знаю, квалифицируется ли это как «преждевременная оптимизация». Надеюсь, кто-то с глубоким знанием коллекционеров мусора JVM может дать представление.Полезно проверить, пуста ли Java-коллекция пуста до начала итерации?

Кроме того, я не знаю, как обрабатывается компилятор Java для каждого цикла. Я предполагаю, что стиль B преобразован в стиль A автоматически. Но ... может быть, пустая проверка включена.

Петля стилизации

Collection<String> collection = ... 
Iterator<String> iter = collection.iterator(); 
while (iter.hasNext()) { 
    String value = iter.next(); 
    // do stuff 
    // maybe call iter.remove() 
} 

петля Стиль B

Collection<String> collection = ... 
for (String value : collection) { 
    // do stuff 
} 

петли типа А (Modified)

Collection<String> collection = ... 
if (!collection.isEmpty()) { 
    Iterator<String> iter = collection.iterator(); 
    while (iter.hasNext()) { 
     String value = iter.next(); 
     // do stuff 
     // maybe call iter.remove() 
    } 
} 

Loop Style B (Modified)

Collection<String> collection = ... 
if (!collection.isEmpty()) { 
    for (String value : collection) { 
     // do stuff 
    } 
} 
+4

Зачем проверять пустое, это защитное программирование в худшем случае !, проверка на 'null' - это одно, но проверка на пустое - это просто плохая практика. –

+0

Почему? Я могу видеть выгоду ... вместо того, чтобы обращаться к итератору и проверять вызов метода, чтобы увидеть, есть ли 'next', что будет делать JVM для объекта (для объекта obj: objects)', это будет просто обойти весь этот код, если коллекция пуста ... насколько я вижу, это оптимизация, теперь, если она хорошая, это другое дело ... – mFeinstein

ответ

0

Нет, вы не должны проверить пустой. Первая итерация сделает трюк для вас.

0

Метод iter.hasNext() возвращает значение true/false. если в коллекции нет элемента, то итератор просто возвращает false при выполнении инструкции iter.hasNext(), и цикл будет прекращен изящно.

0

Нет необходимости проверять, нет ли коллекции. Если вы выполняете итерацию с помощью цикла for или используя цикл while с итератором, он не будет входить в итерацию, если коллекция пуста.

Но когда вы выполняете итерирование коллекции, вы должны проверить, не является ли коллекция непустой. Он может выбросить NullPointerException, если коллекция равна null, и вы пытаетесь выполнить итерацию с помощью цикла или итератора.

Вам не нужно проверять, пуста ли коллекция.

Смежные вопросы