黑马程序员技术交流社区
标题:
关于ListIterator的疑问
[打印本页]
作者:
心弦上的景致
时间:
2013-4-14 23:05
标题:
关于ListIterator的疑问
class Dsdasdasd{
public static void main(String[] args){
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("java02"))
//al.add("java04");
it.remove();
}
System.out.println("obj=" + obj);
}
System.out.println(al);
}
复制代码
添加删除抛异常 集合对象在内存的存储方式也了解
但是为什么最后还是把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