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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
迭代器和生成器的一些注意问题
一、迭代器可迭代的(可迭代对象): 可迭代对象都是可迭代的。如:str、list、dict、tuple、文件对象等等 只要是对象有__iter__内部方法,就可以称之为可迭代对象迭代器: 迭代器也是可迭代的,他不光有__iter__方法,还有__next__方法。 迭代器一次只能取一个值,直到取完后引发一个错误 获得一个迭代器: 调用可迭代对象的__iter__()就可以获得迭代器 使
如何解决ie中有了死循环占用大量资源的问题?
1. 干净引导-------------------------对于XP,步骤如下:1) 点击Start -> Run-> 输入"MSCONFIG" 并点击OK.2) 点击 Service -> 选择"Hide All Microsoft Services"-> 点击Disable All.3) 选择Startup -> 点击Disable All并点击OK.4) 重新启动计算机.2. 恢复缺省的
杀死进入死循环的进程
最近调试picc模块 在写代码的时候不小心写了一个不会退出的循环.结果一直打印,adb无法exit. 每次都是要拔掉电源,太麻烦了. 现在总结一种简单一点的办法: (杀掉该进程) 在adb 进入死循环,比如不停打印的时候,无法exit, 这个时候再新开一个shell窗口. 然后在新shell窗口中进入adb liw@LIW:~/Code$ liw@LIW:~/Code$
Ubuntu登录界面死循环解决方法
在配置Ubuntu扩展屏幕时, 在字符终端执行了 sudo startx 后面再次使用图形界面登录Ubuntu时, 结果Ubuntu在登录界面死循环, 字符终端能正常登录. 对于这个问题, 可以通过以下方式解决. 通过字符终端进入系统, 可以通过ctrl+alt+[f1到f6任意], 打开登录界面. 然后登录进入用户目录 执行以下命令 sudo chmod username
WM_PAINT消息的异常情况
碰到了一个很纠结的事情,结果我找了很久才找到问题所在,竟然出在了WM_PAINT消息里面。我本来是想写些GDI的东西的,想设个定时器每隔点时间画个点。结果纠结的事情就是定时器不起作用了,就是画不出点。后来我做了一个精简,写了个小程序,在按下左键的时候触发定时器,然后每1S钟触发W
Ubuntu16.04: 用户登录界面死循环问题的解决
转载:http://blog.csdn.net/ssmixi/article/details/73483795 Ubuntu 16.04 用户登录界面死循环问题的解决 本人机器用来学习深度学习,配置环境:ubuntu 16.04+tensorflow+cudnn,刚开始经常出现重启或
java 中的死循环 for(;;)
输出2 4 6  顺序可以改变 并统计程序执行了多少次 利用到了random 产生随机数 package mihe;import java.util.Random;public class Test03 { public static void main(String[] args) { Random random = new Random(); int count = 0; for (...
解决遍历迭代器时添加元素会出现异常的问题
今天在写代码时遇到了一个异常 Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException 上网查后发现是遍历迭代器时添加元素会出现异常的问题
解决tomcat启动被某个servlet里执行方法死循环tomcat被hold的问题
tomcat 未启动完整  , 被某个ervlet     hold住  使得整个项目启动不了,解决办法如下: 第一步:启动一个新线程, 来操作你启动时要执行的业务代码  public class StartThread extends Thread {      public void run() {     try { ClientSample.test();//这里
vector中使用迭代器注意事项
1.使用iter++;和++iter;两种方式遍历的次数是相同的,但在STL中效率不同。前++返回引用,后++返回一个临时对象,因为iterator是类模板,使用 iter++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。 2.使用迭代器遍历时添加删除元素,可使用以下格式:for(iter = tria