A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wnmmp 中级黑马   /  2014-8-7 23:35  /  2087 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();
        }


14 个回复

倒序浏览
你这上下两个代码不是一样的么
回复 使用道具 举报
:dizzy:你这两个都一样啊...
remove当然在next后面,先择出后移除,嗯,个人理解.今天才刚刚看了这部分...:loveliness:
回复 使用道具 举报
IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。

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

同时你那个自认为正确的写法,我也认为有点问题。。还没测试完毕。。就先不说了。。
回复 使用道具 举报
楼主:你认为正确的这个:
   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移出一个,所以最后是空的。。。


回复 使用道具 举报
remove方法删除前一个迭代对象,所以必须要先调用next
回复 使用道具 举报
只有先获取才能删除呀,不获取怎么删除呀,所以remove要放到后面
回复 使用道具 举报
Ezreal 发表于 2014-8-7 23:40
你这上下两个代码不是一样的么

不好意思,改了:L
回复 使用道具 举报
烟海 发表于 2014-8-8 00:07
楼主:你认为正确的这个:
   while(it.hasNext()){
                        System.out.println(it.next( ...

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

改了改了,但是取出的在循环外,循环完不就没了么
回复 使用道具 举报
都没有索引   jvm怎么知道移除哪个呢
回复 使用道具 举报
zhouqun 发表于 2014-8-8 21:01
都没有索引   jvm怎么知道移除哪个呢

这貌似是ListIterator里面的remove方法吧,不需要传具体对象或者索引的
回复 使用道具 举报
wnmmp 发表于 2014-8-8 15:52
改了改了,但是取出的在循环外,循环完不就没了么

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

所以在循环外。。it.remove 还可以移出最后一个值。。。
回复 使用道具 举报
Iterator的remove方法是从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
所以只有当指针在最后位置时才能使用remove.
只有ListIterator 可以在迭代的时候使用增删改
回复 使用道具 举报
烟海 发表于 2014-8-8 21:58
因为迭代器不在循环内。。
所以循环结束。。。it.next()取出的最后一个值还在。。。

也只能这么理解了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马