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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qisikudingcha 中级黑马   /  2014-1-19 10:19  /  1515 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 qisikudingcha 于 2014-1-23 15:08 编辑
  1. ArrayList<String> list = new ArrayList<String>();
  2.                 list.add("张三");
  3.                 list.add("李四");

  4.                 Iterator<String> it = list.iterator();

  5.                 while (it.hasNext()) {

  6.                         System.out.println(it.next());

  7.                         list.remove("张三");

  8.                 }
复制代码

这样子用不会报错,但是如果list中只添加一个“张三”元素,就会报错,这是为什么???

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

6 个回复

正序浏览
对集合使用Iterator进行进行遍历时删除集合里面的元素,使用Iterator里面的remove方法删除集合里面的元素,而不用集合本身自带的remove方法。集合在遍历时,使用的是Iterator迭代器进行遍历,如果使用集合本身自带的remove方法进行删除时,集合的大小已经改变了,但是Iterator迭代器并不知道集合大小已经改变,遍历集合的时候依然使用原始的集合大小,就会出现问题。在对集合使用Iterator遍历的时候对集合进行添加时,也是使用迭代器里面的add方法。

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
qisikudingcha + 2 很给力!
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 向阳泪无痕 于 2014-1-23 11:03 编辑

先看看你的代码
  1. <p>while (it.hasNext()) {
  2. 08.
  3. 09.       System.out.println(it.next());
  4. 10.
  5. 11.        list.remove("张三");   //问题出在这,如果集合里面只有一个元素,而正好你又删除这个元素,那么这个时候这个集合就是空了,</p><p>                                              //这个时候在判断 it.hasNext()就会报异常
  6. 12.
  7. 13.    }
  8. </p>
复制代码


把你的  while循环   改成下面的方法就对了。。。

  1. while (it.hasNext()) {   //改成这样就对了
  2.                                                 
  3.             String s = it.next();

  4.             System.out.println(s);

  5.               if("张三".equals(s))
  6.                            it.remove();

  7.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
  1. ArrayList<String> list = new ArrayList<String>();
  2.                 list.add("张三");


  3.                 Iterator<String> it = list.iterator();

  4.                 while (it.hasNext()) {

  5.                         System.out.println(it.next());

  6.                         list.remove("张三");

  7.                 }
复制代码

我的意思是这种情况就会报错,但是下面这种情况就不会,这是为什么
  1. ArrayList<String> list = new ArrayList<String>();
  2.                 list.add("张三");
  3.                 list.add("李四");

  4.                 Iterator<String> it = list.iterator();

  5.                 while (it.hasNext()) {

  6.                         System.out.println(it.next());

  7.                         list.remove("张三");

  8.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. public class Itcast {
  4.         public static void main(String[] args) {
  5.                 ArrayList<String> list = new ArrayList<String>();
  6.                 // list.add("张三");
  7.                 list.add("李四");
  8.                 Iterator<String> it = list.iterator();
  9.                 while (it.hasNext()) {
  10.                         System.out.println(it.next());
  11.                         list.remove("张三");
  12.                 }
  13.         }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
哥们不会的,你描述的是不是有点问题呢
回复 使用道具 举报
判断一下 if(it.next().equals("张三"))然后再删除
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马