z_fortop 2016-03-16 13:30 采纳率: 100%
浏览 2027
已采纳

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

代码如下:

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条回答 默认 最新

  • 毕小宝 博客专家认证 2016-03-16 13: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的实现类就可以了。
    第四,你的代码没有问题的,我测试过了,按我说的修改后,可以正常运行的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名