首页 > ListIterator的add方法的死循环问题

ListIterator的add方法的死循环问题

import java.util.*;

public class Main {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<String> name = new ArrayList<String>();
    name.add("同学A");
    name.add("同学B");
    name.add("同学C");
    name.add("同学D");
    name.add("同学E");
    name.add("同学F");
    ListIterator<String> li = name.listIterator();
    while (li.hasNext()) {
        //System.out.println(li.next());
        li.add("下一个");
        }    
    System.out.println(name);
    }
}

调用ListIterator的add方法将元素插入原始List中,但是如果插入中间位置是否会陷入死循环呢,插入一个元素后,ListIterator的元素数量增加了,这样的话,相当于自己给自己添加元素,然后还遍历自己再添加元素,就如上面的代码就会造成死循环,但是如果把System.out.println(li.next());这行的注释取消就没问题,这是为什么呢?


你可以这样输出看看:

import java.util.*;

public class Main {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<String> name = new ArrayList<String>();
    name.add("同学A");
    name.add("同学B");
    name.add("同学C");
    name.add("同学D");
    name.add("同学E");
    name.add("同学F");
    ListIterator<String> li = name.listIterator();
    int cnt = 0;
    while (li.hasNext()) {
        //System.out.println(li.next());
        li.add("下一个");
        if(cnt++ >= 20)
            break;
        }    
    System.out.println(name);
    }
}

add方法是在Iterator指向的元素前面插入新元素的,插入后Iteratro指向的元素是新插入的元素后面的那个元素(也就是调用add前Iterator指向的元素)。所以如果不调用next方法,Iterator总是指向 "同学A",然后每次add就是在 "同学A" 前面插入 "下一个",就死循环了,但是如果每次循环调用next,Iterator就依次指向了"同学A"、"同学B"、"同学C" ...,就能够正常结束循环。

【热门文章】
【热门文章】