黑马程序员技术交流社区

标题: Iterator迭代器的remove方法 [打印本页]

作者: wnmmp    时间: 2014-8-7 23:35
标题: Iterator迭代器的remove方法
本帖最后由 wnmmp 于 2014-8-8 15:46 编辑

为什么Iterator迭代器的remove方法放在迭代过程前面错误,而放在后面就正确了,迭代过程的it.next()是局部变量,循环完不就没有了吗?
        放在迭代过程前(出错):
        public static void main(String[] args) {
                Collection coll = new ArrayList();
                coll.add("abc1");
                coll.add("abc2");
                Iterator  it = coll.iterator();   
                it.remove();     
                while(it.hasNext()){
                        System.out.println(it.next());
                }
        }
        放在迭代过程后(正确):
        public static void main(String[] args) {
                Collection coll = new ArrayList();
                coll.add("abc1");
                coll.add("abc2");
                Iterator  it = coll.iterator();        
                while(it.hasNext()){
                        System.out.println(it.next());
                }
                it.remove();
        }



作者: Ezreal    时间: 2014-8-7 23:40
你这上下两个代码不是一样的么
作者: 柠萌不    时间: 2014-8-7 23:51
:dizzy:你这两个都一样啊...
remove当然在next后面,先择出后移除,嗯,个人理解.今天才刚刚看了这部分...:loveliness:
作者: 烟海    时间: 2014-8-8 00:02
IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。

这个是手册里面的。。。放在前面的时候,还没有取出it.next() 没有从迭代器中取出来东西。。怎么移出呢?所以自然错了。。

同时你那个自认为正确的写法,我也认为有点问题。。还没测试完毕。。就先不说了。。
作者: 烟海    时间: 2014-8-8 00:07
楼主:你认为正确的这个:
   while(it.hasNext()){
                        System.out.println(it.next());
               }
              it.remove();
这个其实算是凑巧编译执行没问题的。。
因为这时候存在最后一次next的值,所以这时候把最后一个值移出了。。这时候有值,所以不会报错,,,
但是你这时候打印下coll,你就会发现,集合中只有abc1一个值了。。你可以试试。。。

   while(it.hasNext()){
                        System.out.println(it.next());
                        it.remove();
               }
             System.out.println(coll);
如果你这样移出,那么最后打印的结果,就是空了。。。因为这个是每next取出一个值,就remove移出一个,所以最后是空的。。。



作者: justin1258    时间: 2014-8-8 09:55
remove方法删除前一个迭代对象,所以必须要先调用next
作者: 南柯一梦    时间: 2014-8-8 10:48
只有先获取才能删除呀,不获取怎么删除呀,所以remove要放到后面
作者: wnmmp    时间: 2014-8-8 15:46
Ezreal 发表于 2014-8-7 23:40
你这上下两个代码不是一样的么

不好意思,改了:L
作者: wnmmp    时间: 2014-8-8 15:50
烟海 发表于 2014-8-8 00:07
楼主:你认为正确的这个:
   while(it.hasNext()){
                        System.out.println(it.next( ...

有道理,这算不算bug呢?remove放在循环外,循环完不就没有it.next()那个取出来的了
作者: wnmmp    时间: 2014-8-8 15:52
柠萌不 发表于 2014-8-7 23:51
你这两个都一样啊...
remove当然在next后面,先择出后移除,嗯,个人理解.今天才刚刚看了这部分...:lov ...

改了改了,但是取出的在循环外,循环完不就没了么
作者: zhouqun    时间: 2014-8-8 21:01
都没有索引   jvm怎么知道移除哪个呢
作者: 刷新召唤    时间: 2014-8-8 21:50
zhouqun 发表于 2014-8-8 21:01
都没有索引   jvm怎么知道移除哪个呢

这貌似是ListIterator里面的remove方法吧,不需要传具体对象或者索引的
作者: 烟海    时间: 2014-8-8 21:58
wnmmp 发表于 2014-8-8 15:52
改了改了,但是取出的在循环外,循环完不就没了么

因为迭代器不在循环内。。
所以循环结束。。。it.next()取出的最后一个值还在。。。

所以在循环外。。it.remove 还可以移出最后一个值。。。
作者: 地狱天堂    时间: 2014-8-8 22:13
Iterator的remove方法是从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
所以只有当指针在最后位置时才能使用remove.
只有ListIterator 可以在迭代的时候使用增删改

作者: wnmmp    时间: 2014-8-8 23:43
烟海 发表于 2014-8-8 21:58
因为迭代器不在循环内。。
所以循环结束。。。it.next()取出的最后一个值还在。。。

也只能这么理解了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2