程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 對象-迭代器取值進入死循環問題

對象-迭代器取值進入死循環問題

編輯:編程解疑
迭代器取值進入死循環問題

代碼如下:

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

wojiushiwo945you
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved