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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 倉促、尋找你 中级黑马   /  2014-1-16 22:14  /  1170 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


迭代器在是如何实现对集合的遍历的?为啥在遍历集合的时候,对集合进行添加元素会报错呢?怎么解决呢?

评分

参与人数 1技术分 +1 收起 理由
船长 + 1

查看全部评分

2 个回复

倒序浏览
元素的引用存放在集合之中,通过集合的方法可以对元素进行操作。
通过集合的iterator()方法,把元素的引用取到迭代器里面去了。
现在能操作元素的方式有2种。要么通过集合的方式操作元素,要么通过迭代器的方式操作元素。
可是这两种方式操作的是同一组元素,所以会产生问题:
迭代器正在取出操作,你又用到了集合的功能操作元素,就有可能产生安全隐患(并发访问)。
  比如:你在取,我在加。你到底取不取我加的元素呢?
因此不能对同一组元素进行多种同时操作。否则就有可能产生并发修改异常!
----
这个问题该怎么解决呢?
你要么用集合的方法,你要么用迭代器的方法。
假如在迭代过程中就不用集合了。而是用迭代器。
但是迭代器Iterator只有判断,取出,删除3个方法,没有对元素进行添加的方法。有局限性。
如果想要其他的操作如添加,修改等,就需要使用Iterator的子接口ListIterator
下面看个有关ListIterator的例子:
  1. import java.util.ArrayList;
  2. import java.util.ListIterator;

  3. public class ListDemo {

  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);
  7.         }
  8.        
  9.         public static void main(String[] args)
  10.         {

  11.                 //演示列表迭代器。
  12.                 ArrayList al = new ArrayList();

  13.                 //添加元素
  14.                 al.add("java01");
  15.                 al.add("java02");
  16.                 al.add("java03");

  17.                 sop(al);
  18.                
  19.                 ListIterator li = al.listIterator();

  20.                 while(li.hasNext())
  21.                 {
  22.                         Object obj = li.next();

  23.                         if(obj.equals("java02"))
  24.                                 li.add("java009");
  25.                                 //li.set("java006");


  26.                 }

  27.                 sop(al);
  28.         }

  29. }
复制代码

运行结果:
[java01, java02, java03]
[java01, java02, java009, java03]
回复 使用道具 举报
private static void demo() {
                List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
               
                Iterator it = list.iterator();//Iterator it = new Itr(),多态,父类引用指向子类对象这里是 //Iterator 接口
                while(it.hasNext()) {  //iterator中的方法 hasNext()判断是否有元素,有元素返回true
                        Object obj = it.next();//next(),方法得到元素
                        //if(obj.equals("aaa"))
                        //        it.remove();
                        System.out.println(obj);
                }
}

在遍历之前添加 。。。。当迭代器和集合对象连接时,集合中的对象就已经确定下来了。你要是在那时添加,集合就变了。所以会报错的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马