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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丰亚彬 高级黑马   /  2012-5-30 21:09  /  2045 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丰亚彬 于 2012-5-30 22:18 编辑

下面代码迭代的时候,请看注释的部分和没注释部分
  1. import java.util.*;
  2. class ListIteratorDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList al = new ArrayList();
  7.                 al.add("java01");
  8.                 al.add("java02");
  9.                 al.add("java03");
  10.                 al.add("java04");
  11.                 ListIterator li = al.listIterator();

  12.                 while(li.hasNext())
  13.                 {
  14.                         Object obj = li.next();
  15.                         if(obj.equals("java02"))
  16.                         {        
  17.                                 li.set("java002");//这样是正确的
  18.                                 li.add("javaTemp");
  19.                                 //li.add("javaTemp");如果先增加会报告异常,不知道里面指针怎么移动的
  20.                                 //li.set("java002");
  21.                         }
  22.                 }
  23.                 System.out.println(al);
  24.         }
  25. }
复制代码
哪位高手给个解释

点评

这个问题好  发表于 2012-5-31 13:00

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

8 个回复

正序浏览
增删改 个人感觉还是用linklist好点,关于你这里出现的问题,是由于迭代器的指针序列的原因,当你创建一个迭代器之后,此迭代器的指针序列已经确定,如果要对原先的集合增加元素时候,由于原集合值已经改变,所以迭代器内部指针序列也随之改变。
回复 使用道具 举报
王渠 中级黑马 2012-5-30 23:07:10
8#
丰亚彬 发表于 2012-5-30 22:54
我add一个以后,要到下一个next才能取到刚才add的那个,那么岂不是add以后next指的还是刚才的那个吗 ...

就是这里有问题,所以才会出异常。因为迭代器和集合不是同步的。就算迭代器里面有了,但是集合中还是没有...我是这么想的。
回复 使用道具 举报
王渠 中级黑马 2012-5-30 23:07:01
7#
丰亚彬 发表于 2012-5-30 22:54
我add一个以后,要到下一个next才能取到刚才add的那个,那么岂不是add以后next指的还是刚才的那个吗 ...

就是这里有问题,所以才会出异常。因为迭代器和集合不是同步的。就算迭代器里面有了,但是集合中还是没有...我是这么想的。
回复 使用道具 举报
王渠 发表于 2012-5-30 22:50
set()方法作用的是next或者previous返回的最后的元素,当你在你add添加一个或者remove删除一个时,实际上ne ...

我add一个以后,要到下一个next才能取到刚才add的那个,那么岂不是add以后next指的还是刚才的那个吗
回复 使用道具 举报
set()方法作用的是next或者previous返回的最后的元素,当你在你add添加一个或者remove删除一个时,实际上next指向已经不是之前那个了,所以set方法会出错
回复 使用道具 举报
麦田守望者0812 发表于 2012-5-30 22:35
void set(E o) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 nex ...

呃,关键是add或者remove后next或者previous返回的元素应该没变吧。。。。
回复 使用道具 举报
void set(E o) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。  应该有所帮助吧
回复 使用道具 举报
哪个高手帮我解答一下~~~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马