gpt4 book ai didi

java - List.remove奇怪的行为

转载 作者:行者123 更新时间:2023-12-02 07:47:48 25 4
gpt4 key购买 nike

注意:与此问题不重复:Why am I not getting a java.util.ConcurrentModificationException in this example? 。问题是,为什么没有抛出异常。

如果我们使用foreachList<String>并尝试从中删除任何元素,然后它会抛出 java.util.ConcurrentModificationException但为什么下面的代码没有抛出相同的异常,也没有处理 User 的第二个对象?

public class Common {

public static void main(String[] args) {
User user1 = new User();
user1.setFirstname("Vicky");
user1.setLastname("Thakor");

User user2 = new User();
user2.setFirstname("Chirag");
user2.setLastname("Thakor");

List<User> listUser = new ArrayList<User>();
listUser.add(user1);
listUser.add(user2);

int count = 0;
for (User user : listUser) {
System.out.println(count + ":" + user.getFirstname()+" "+ user.getLastname());
count++;
listUser.remove(user);
}
}
}

输出为:

0:Vicky Thakor

最佳答案

虽然问题不是完全重复,但链接的问题:Why am I not getting a java.util.ConcurrentModificationException in this example?包含答案。

当调用迭代器的 next() 方法时,会进行验证是否抛出异常的检查,但仅当 hasNext() 返回 true。在您的情况下,当列表有两个元素并且您在第一次迭代中删除第一个元素时,条件为:

public boolean hasNext() {
return cursor != size(); // 1 != 1 after first iteration
}

意外地为false,因为cursor位于1,而这就是size(),位于片刻。因此 next() 不会被调用,并且不会引发异常。

添加第三个元素:

listUser.add(user2);

并且异常将被抛出。但是,您不应该依赖这种行为,因为,如 the documentation解释说,不保证:

Note that fail-fast behavior cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast operations throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

关于java - List.remove奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27111028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com