2015-06-12 4 views
3

Скажем, я запускаю этот код, он показывает мне это: 1 10 2 10 3 10ListIterator последний hasNext() что-то не понял,

public class Test1{ 
public static void main(String[] args) { 
    LinkedList<Integer> list = new LinkedList<Integer>(); 
    list.add((1)); 
    list.add((2)); 
    list.add((3)); 
    ListIterator<Integer> it = list.listIterator(); 
    while(it.hasNext()){ 
     it.next(); 
     it.add((10)); 
    } 
    for(Integer i : list){ 
     System.out.println(i); 
    }   
} 

То, что я не получаю, почему последний hasNext() имеет место даже подумал, что мы должны быть в конце списка (в моем понимании). На элементе 3.

Во-первых, итератор на 1. hasNext() возврата true потому что список имеет 2 после. Итак, я вхожу в цикл, it.next() возвращает меня 1 и устанавливает курсор на 2. Когда я добавляю 10, это происходит в курсоре так, чтобы между 1 и 2. затем it.next() возвращает меня 2 и устанавливает курсор на 3. Затем я добавляю 10 между 2 и 3. Но на данный момент у меня нет следующего из 3, так почему hasNext() верните true, чтобы добавить 12 на последнем месте списка?

ответ

3

итераторов в Java созданы, чтобы указать на место до начала списка, поэтому первый вызов next() возвращает первый элемент, если в списке есть. Таким образом, вы перейдете все элементы списка и добавьте 10 после каждого из них.

2

Курсор всегда между элементов. Когда вы добавляете элемент через итератор списка, элемент добавляется в позицию курсора, а курсор перемещается после элемента, который вы только что вставили. Это также объясняется in the javadoc.

Подумайте о позиции курсора, что путь, по порядку:

1  2  3 
^
hasNext? yes => call next (returns 1) 
    1  2  3 
     ^
call add 
    1  10  2  3 
      ^
hasNext? yes => call next (returns 2) 
    1  10  2  3 
        ^
call add 
    1  10  2  10   3 
           ^
hasNext? yes => call next (returns 3) 
    1  10  2  10   3 
             ^
call add 
    1  10  2  10   3  10 
                ^
hasNext? no => exit loop