代碼如下:
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的實現類就可以了。
第四,你的代碼沒有問題的,我測試過了,按我說的修改後,可以正常運行的。