在迭代

时间:2018-02-05 02:39:11

标签: java list

我正在玩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中列表的实际行为?

0 个答案:

没有答案