2 z fortop z_fortop 于 2016.03.16 21:30 提问

迭代器取值进入死循环问题

代码如下:

import java.util.*;
public class AA
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();

    al.add("a");
    al.add("b");
    al.add("c");
    al.add("a");

    ListIterator it = al.listIterator();

    while(it.hasNext())
    {
        if((al.size())==4)  
        {

           it.add("vv");
        }
    }

    sop(al);

}
public static void sop(Object obj)  
{
    System.out.println(obj);
}

}

1.为什么会进入死循环?
2. if((al.size())==4) 的书写是否有问题? 执行了 it.add("vv"); 后,再进入 if((al.size())==4) 的al.size()是否就为5了??
3.Iterator不能add 如果add只能用子类的ListIterator 可是我改为Iterator后仍然能运行
4. it.add("vv"); 书写是否正确 在迭代器中要用迭代器更改元素,我改为al.add("vv")同样能运行

多谢各位大神了 真心谢谢!!

另外本人微信 zhuxiaoyu0408 真心求一JAVA师傅 !!

2个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.16 21:56
已采纳

首先,之所以进入死循环,因为第一次whilt(it.haxNext())是ture,后执行循环体,但是你并没有将迭代器往后移动啊,当然迭代器的位置始终是在第一个元素的位置。你修改下代码,取下一个元素,迫使迭代器往后移动一个位置。如下:

        while (it.hasNext()) {
            if ((al.size()) == 4) {
              System.out.println(al.size());
                it.add("vv");
            }
            //next操作,迫使迭代器往后移动,下一轮循环继续
            it.next();
        }

其次,迭代器的位置已经移动到al.size==4时,你添加了add("vv"),al.size()就会动态变为5了,你可以加一行测试下。
第三,定义变量的时候可以定义为Iterator,例如Iterator it=al.listIterator();这是面向抽象编程的思想,即变量定义为抽象类,赋值是真正的Iterator的实现类就可以了。也可以直接是某个子类定义(即你的用法),但是,只要知道赋值是真正的Iterator的实现类就可以了。
第四,你的代码没有问题的,我测试过了,按我说的修改后,可以正常运行的。

z_fortop
z_fortop 谢谢大神!!!谢谢 全解决了!!!
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you System.out.println(al.size());这行放在it.add("vv")后面,就能看到size是动态变化的。
接近 2 年之前 回复
cxsmarkchan
cxsmarkchan   2016.03.16 22:05

楼上毕小宝已经说得很充分了,我只就第四个问题补充一些内容:
it.add("vv")是正确的,它会在it.next元素前插入。在你这个问题中,it.next()指向数组首位置,因此"vv"插入在第一个元素"a"的前面。
al.add("vv")默认是在al数组的尾端插入。但是,如果你定义了iterator,那么强烈不建议你使用al.add。因为如果你通过it插入,it会调整其指向,保证一致性。但如果你用al插入,al的结构改变了(在内存中的地址也可能改变),而你定义的it并不知道这一点。因此,继续使用it的时候就可能会报错。
换句话说,只要你用al.add或者al.remove等做了更新,那么此前定义的iterator全部失效,再使用的时候需要重新定义。

z_fortop
z_fortop 谢谢 谢谢!!!! 学到了额外的知道 再次谢谢!
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!