黑马程序员技术交流社区

标题: 集合中发现的一个问题,高手来哦~~~ [打印本页]

作者: 丰亚彬    时间: 2012-5-30 21:09
标题: 集合中发现的一个问题,高手来哦~~~
本帖最后由 丰亚彬 于 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-30 22:21
哪个高手帮我解答一下~~~~~~
作者: 麦田守望者0812    时间: 2012-5-30 22:35
void set(E o) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。  应该有所帮助吧
作者: 丰亚彬    时间: 2012-5-30 22:43
麦田守望者0812 发表于 2012-5-30 22:35
void set(E o) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 nex ...

呃,关键是add或者remove后next或者previous返回的元素应该没变吧。。。。
作者: 王渠    时间: 2012-5-30 22:50
set()方法作用的是next或者previous返回的最后的元素,当你在你add添加一个或者remove删除一个时,实际上next指向已经不是之前那个了,所以set方法会出错
作者: 丰亚彬    时间: 2012-5-30 22:54
王渠 发表于 2012-5-30 22:50
set()方法作用的是next或者previous返回的最后的元素,当你在你add添加一个或者remove删除一个时,实际上ne ...

我add一个以后,要到下一个next才能取到刚才add的那个,那么岂不是add以后next指的还是刚才的那个吗
作者: 王渠    时间: 2012-5-30 23:07
丰亚彬 发表于 2012-5-30 22:54
我add一个以后,要到下一个next才能取到刚才add的那个,那么岂不是add以后next指的还是刚才的那个吗 ...

就是这里有问题,所以才会出异常。因为迭代器和集合不是同步的。就算迭代器里面有了,但是集合中还是没有...我是这么想的。
作者: 王渠    时间: 2012-5-30 23:07
丰亚彬 发表于 2012-5-30 22:54
我add一个以后,要到下一个next才能取到刚才add的那个,那么岂不是add以后next指的还是刚才的那个吗 ...

就是这里有问题,所以才会出异常。因为迭代器和集合不是同步的。就算迭代器里面有了,但是集合中还是没有...我是这么想的。
作者: 于清云    时间: 2012-5-31 12:36
增删改 个人感觉还是用linklist好点,关于你这里出现的问题,是由于迭代器的指针序列的原因,当你创建一个迭代器之后,此迭代器的指针序列已经确定,如果要对原先的集合增加元素时候,由于原集合值已经改变,所以迭代器内部指针序列也随之改变。




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