List iterator迭代问题。

theoffspring 2010-06-09 11:06:01
package misc;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestListRemove {

public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String str = "td" + i;
list.add(str);
}

for (Iterator it = list.iterator(); it.hasNext();) {
String str = (String) it.next();//这里会报错
System.out.println(str);
if (str.equals("td9")) {
list.remove(str); // td9应该是最后一个元素
}
}


}
}


td9是list里最后一个元素,删完它,程序就应该退出循环了,但我跟踪了一下,发现又进入循环了,执行String str = (String) it.next(),这是怎么回事?
...全文
353 23 打赏 收藏 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssszhangbo 2010-06-12
  • 打赏
  • 举报
回复
使用iterator遍历容器的时候其内部会执行锁定,所以你再用list。remove(str)操作时没有任何作用的,相反其代码也存在安全隐患。只能使用it.remove()
dhmj2ee 2010-06-12
  • 打赏
  • 举报
回复
这段代码我稍作了修改

List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String str = "td" + i;
list.add(str);
}

for (String temp:list) {
System.out.println(temp);
if ("td9".equals(temp)) {
temp=null;
}
}
b11ght 2010-06-10
  • 打赏
  • 举报
回复
在遍历集合的时候修改或者删除集合里面的对象会抛出ConcurrentModificationException的。
ronniegxq 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 uguan 的回复:]

while (it.hasNext()) {
String str = (String) it.nex();//报java.util.ConcurrentModificationException异常
System.out.println(str);
if (str.equals("td9")) {
……
[/Quote]
up
Ark032425 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 uguan 的回复:]
while (it.hasNext()) {
String str = (String) it.nex();//报java.util.ConcurrentModificationException异常
System.out.println(str);
if (str.equals("td9")) {
list.remove(str);
}
}
Conc……
[/Quote]
对,会抛异常的。
csupanmin 2010-06-10
  • 打赏
  • 举报
回复
打酱油,没该出来,悲哀
uguan 2010-06-10
  • 打赏
  • 举报
回复
while (it.hasNext()) {
String str = (String) it.nex();//报java.util.ConcurrentModificationException异常
System.out.println(str);
if (str.equals("td9")) {
list.remove(str);
}
}
ConcurrentModificationException:某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不明确的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险
dddddz 2010-06-10
  • 打赏
  • 举报
回复
在用Iterator去取集合元素的过程中(如Map、List),禁止使用集合本身的remove方法删除元素,用Iterator的 remove()方法代替
否则会报异常java.util.ConcurrentModificationException。
Rogice 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 whut_lcy 的回复:]
首先,你的代码是不安全的。在遍历List的时候还要去删除元素,很容易出现并发异常。这个不建议使用。非要使用,你可以用一个备份List操作
[/Quote]
同意三楼的做法,这是最安全的,备份一个List,然后遍历原来的那个list,把其中符合你要求的元素add到备份的List中去
爱凌寒 2010-06-10
  • 打赏
  • 举报
回复
建议楼主看看API

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestListRemove {

public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String str = "td" + i;
list.add(str);
}
if(list.contains("td9")){
list.remove("td9");
}
Iterator it = list.iterator(); //
while (it.hasNext()) {
String str = (String) it.next();
System.out.println(str);
}
}
}


爱凌寒 2010-06-10
  • 打赏
  • 举报
回复

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestListRemove {

public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String str = "td" + i;
list.add(str);
}
if(list.contains("td9")){
list.remove("td9");
}
Iterator it = list.iterator(); //
while (it.hasNext()) { //用while吧
String str = (String) it.next();//这里会报错
System.out.println(str);
}
}
}
爱凌寒 2010-06-10
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestListRemove {

public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String str = "td" + i;
list.add(str);
}
if(list.contains("td9")){
list.remove("td9");
}
Iterator it = list.iterator(); //
while (it.hasNext()) { //用while吧
String str = (String) it.next();//这里会报错
System.out.println(str);
}
}
}
baoguodong 2010-06-10
  • 打赏
  • 举报
回复
Iterator 迭代时!相当于同步锁将它锁住!在迭代时是不能对迭代对象进行任何改动的!
xu3352 2010-06-10
  • 打赏
  • 举报
回复
顶 9楼..... 备份一个不就可以了,而且不会 抛出ConcurrentModificationException

for (Iterator it = new ArrayList<String>(list).iterator(); it.hasNext();) {
String str = (String) it.next();
System.out.println(str);
if (str.equals("td9")) {
list.remove(str);
}
}
ChDw 2010-06-10
  • 打赏
  • 举报
回复
list.remove(str);

应该为it.remove();
ouyangxiaokang6 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ivorytower 的回复:]
引用楼主 theoffspring 的回复:
for (Iterator it = list.iterator(); it.hasNext();) {


你最后的元素删完了还调用it.hasNext(),当然就空指针了。建议使用while().
[/Quote]
up,这种迭代的循环一般都用while
Nature_2009 2010-06-10
  • 打赏
  • 举报
回复

// 删除操作应该用迭代器的remove方法,否者会抛出异常。改成如下写法就OK了。

List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String str = "td" + i;
list.add(str);
}

for (Iterator it = list.iterator(); it.hasNext();) {
String str = (String) it.next();
System.out.println(str);
if ("td9".equals(str)) {
// list.remove(str); // td9应该是最后一个元素
it.remove(); // 改动点。。。。
}
}
dr_lou 2010-06-10
  • 打赏
  • 举报
回复
今天第二个在iterator遍历中作删除的人。

用for(int i=0;i<list.size();i++)遍历吧,想怎么删由你
qykshr 2010-06-10
  • 打赏
  • 举报
回复
过来学习一下
  • 打赏
  • 举报
回复
[Quote=引用楼主 theoffspring 的回复:]
for (Iterator it = list.iterator(); it.hasNext();) {

[/Quote]
你最后的元素删完了还调用it.hasNext(),当然就空指针了。建议使用while().
加载更多回复(3)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧