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(),这是怎么回事?
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(),这是怎么回事?
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);
}
Iterator it = list.iterator(); //
while (it.hasNext()) { //用while吧
String str = (String) it.next();//这里会报错
System.out.println(str);
if (str.equals("td9")) {
list.remove(str); // td9应该是最后一个元素
}
}
}
}
String str = (String) it.nex();//报java.util.ConcurrentModificationException异常
System.out.println(str);
if (str.equals("td9")) {
list.remove(str);
}
}
ConcurrentModificationException:某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不明确的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险
// 删除操作应该用迭代器的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(); // 改动点。
}
}
String str = (String) it.next();
System.out.println(str);
if (str.equals("td9")) {
list.remove(str);
}
}
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);
}
}
}
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);
}
}
}
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);
}
}
}
否则会报异常java.util.ConcurrentModificationException。
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;
}
}