黑马程序员技术交流社区

标题: 关于ListIterator的疑问 [打印本页]

作者: 心弦上的景致    时间: 2013-4-14 23:05
标题: 关于ListIterator的疑问
  1. class Dsdasdasd{

  2.         public static void main(String[] args){

  3.                 ArrayList al = new ArrayList();
  4.                 al.add("java01");
  5.                 al.add("java02");
  6.                 al.add("java03");
  7.         Iterator it = al.iterator();
  8.         while(it.hasNext()){
  9.         Object obj = it.next();
  10.         if(obj.equals("java02"))
  11.         //al.add("java04");
  12.         it.remove();       

  13.                 }       
  14.         System.out.println("obj=" + obj);
  15.         }
  16.         System.out.println(al);
  17. }
复制代码
添加删除抛异常  集合对象在内存的存储方式也了解  
但是为什么最后还是把java02给删除了 如果并发操作不符合安全规范 那为什么执行删除 却生效了
作者: 心弦上的景致    时间: 2013-4-14 23:16
顺便补充一句
虽然Iterator在迭代上有局限性 有ListIterator为其扩展
但是在内存原理上 为什么会出现上述问题
作者: 王大斌    时间: 2013-4-14 23:18
我觉得是这样的。对于在迭代中时使用集合对象去操作集合如
while(it.hasNext()){

  it.remove();      
  al.add("java04");

  }   

这样会抛出异常



但是如果你只用迭代器去对集合中的元素进行操作的时候。就可以删除

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生并发修改异常。

所以在迭代时候,只能用迭代器的方法操作元素,可以iterator方法有限。

只能对元素进行判断,取出,删除的操作。
作者: 刘策    时间: 2013-4-14 23:51
我说的有以下几点:
我刚运行了一下你的程序,有错误,第一包没有导入,第二,括号位置不对,提示:                          ^
Dsdasdasd.java:20: 错误: 需要<标识符>
        System.out.println(al);
                             ^
这个问题解决了又有一个那就是这个:Dsdasdasd.java:18: 错误: 找不到符号
        System.out.println("obj=" + obj);
                                    ^
  符号:   变量 obj
  位置: 类 Dsdasdasd
删除的只是引用,相当于内存地址值。
作者: smile_joe    时间: 2013-4-15 00:06
本帖最后由 smile_joe 于 2013-4-15 00:08 编辑

你好,你所问的是不是打印obj出来:java01  java02  java03,java02不应该在?

如果这样的话,因为obj这个引用它所做的事是把集合中的元素取出,也就是它指向的是它取出的对象,迭代器删除执行在定义它的后面,
那么对obj没有影响,这删除让al中的数据得到了改变,你仔细想下就是这样!如果你所问是这个疑问....


复制你的程序,进行了修改才运行起来,是3楼说的问题




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