代码如下:
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师傅 !!
首先,之所以进入死循环,因为第一次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的实现类就可以了。
第四,你的代码没有问题的,我测试过了,按我说的修改后,可以正常运行的。
楼上毕小宝已经说得很充分了,我只就第四个问题补充一些内容: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全部失效,再使用的时候需要重新定义。