Метод remove() оставляет объекты

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

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

      List<String> list = new ArrayList<>();

        list.add("Ivan");
        list.add("Petr");
        list.add("Mary");
        list.add("Oleg");
        
        System.out.println(list);
        
        Iterator<String> iterator = list.iterator();

        while(iterator.hasNext()) {
            iterator.next();
            iterator.remove();
        }

        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
        
        for (String s : list) {
            System.out.print(s + " ");
        }
        System.out.println();

        System.out.println(list);

Output:
[Ivan, Petr, Mary, Oleg]
.
.
[]

Но вот когда я вывожу список через итератор, перед методом remove(), я получаю не удаленный список.

        List<String> list = new ArrayList<>();

        list.add("Ivan");
        list.add("Petr");
        list.add("Mary");
        list.add("Oleg");
        
        System.out.println(list);
        
        Iterator<String> iterator = list.iterator();

        // add:
        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }

        while(iterator.hasNext()) {
            iterator.next();
            iterator.remove();
        }

        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
        
        for (String s : list) {
            System.out.print(s + " ");
        }
        System.out.println();

        System.out.println(list);

Output:
[Ivan, Petr, Mary, Oleg]
Ivan Petr Mary Oleg
Ivan Petr Mary Oleg
[Ivan, Petr, Mary, Oleg]

Я не могу понять смысл появления или не удаление листа после обычного перебора. Решения я так и не нашел, поэтому буду рад ответу или ссылку где можно найти ответ.


Ответы (1 шт):

Автор решения: BigTows

Потому что здесь

// add:
while(iterator.hasNext()) {
      System.out.print(iterator.next() + " ");
}

Вы дошли до конца (курсор показывает на последний элемент в коллекции)

И при попытке все удалить.

while(iterator.hasNext()) {
     iterator.next();
     iterator.remove();
}

iterator.hasNext() Возвращает false, так как итератор изжил свое, необходимо создавать новый.

→ Ссылка