开发者社区 问答 正文

ListIterator的add方法的死循环问题

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());这行的注释取消就没问题,这是为什么呢?

展开
收起
蛮大人123 2016-02-27 19:16:38 2462 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    你可以这样输出:

    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" ...,就能够正常结束循环。

    2019-07-17 18:49:17
    赞同 展开评论
问答地址: