我正在玩List并遇到奇怪的行为。
正如我们所知,在迭代List时,我们不应该从该列表中删除元素。如果我们将尝试在迭代时从该List中删除一个元素,那么它将抛出一个异常,但在这种情况下,它不会抛出异常并在迭代时从列表中删除一个元素。 [但它只删除列表中的第一个元素]
示例:
Obj obj = new Obj();
obj.s = "one";
Obj obj1 = new Obj();
obj1.s = "two";
List<Obj> l = new ArrayList<Obj>(Arrays.asList(obj, obj1));
for (Obj a : l) {
l.remove(a);
}
l.forEach(System.out::println);
static class Obj {
String s = "";
@Override
public String toString() {
return s;
}
}
输出: 的
two
我想知道为什么这不会引发异常。
然后我在程序中做了一些更改,并尝试从列表中删除一个元素,然后抛出异常。请查看以下代码。
示例:
for (Obj a : l) {
if (a.s.equals("two")) {
l.remove(a);
}
}
输出:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.base/java.util.ArrayList$Itr.next(Unknown Source)
at main.java.practice.test.Experiment.main(Experiment.java:17)
在第二个程序中,如果要将条件从a.s.equals("two)"
更改为a.s.equals("one")
那么它不会抛出异常。如果有人知道答案,请帮助。
示例:
for (Obj a : l) {
if (a.s.equals("one")) {
l.remove(a);
}
}
l.forEach(System.out::println);
输出:
two
有没有人知道java中列表的实际行为?