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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心弦上的景致 中级黑马   /  2013-4-14 23:05  /  1201 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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给删除了 如果并发操作不符合安全规范 那为什么执行删除 却生效了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
顺便补充一句
虽然Iterator在迭代上有局限性 有ListIterator为其扩展
但是在内存原理上 为什么会出现上述问题
回复 使用道具 举报
我觉得是这样的。对于在迭代中时使用集合对象去操作集合如
while(it.hasNext()){

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

  }   

这样会抛出异常



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

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

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

只能对元素进行判断,取出,删除的操作。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
我说的有以下几点:
我刚运行了一下你的程序,有错误,第一包没有导入,第二,括号位置不对,提示:                          ^
Dsdasdasd.java:20: 错误: 需要<标识符>
        System.out.println(al);
                             ^
这个问题解决了又有一个那就是这个:Dsdasdasd.java:18: 错误: 找不到符号
        System.out.println("obj=" + obj);
                                    ^
  符号:   变量 obj
  位置: 类 Dsdasdasd
删除的只是引用,相当于内存地址值。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 smile_joe 于 2013-4-15 00:08 编辑

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

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


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

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马