我知道如果在某个线程使用迭代器遍历它时更改集合,则 iterator.next() 将抛出ConcurrentModificationException。
但它会根据列表中元素的数量显示不同的行为。
我尝试了一个代码片段,其中我在 for-each 循环中遍历了一个列表,并在遍历之间使用列表的 remove() 方法从列表中删除了一个元素。
理想情况下,它应该在这种情况下抛出 ConcurrentModificationException,而不取决于列表中的元素数量,但是当列表中的元素数量为两个时,情况并非如此。
案例 1: 列表中的元素数量 - 1
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("One");
for (String string : list)
{
System.out.println(string);
list.remove(string);
}
}
输出:一个
线程“主”java.util.ConcurrentModificationException 中的异常
果然不出所料。
案例 2:列表中的元素数量 - 2
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("One");
list.add("two");
for (String string : list)
{
System.out.println(string);
list.remove(string);
}
}
输出:一个
没有抛出异常??????
案例 3:列表中的元素数量 - 3
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
for (String string : list)
{
System.out.println(string);
list.remove(string);
}
}
输出:一个
线程“主”java.util.ConcurrentModificationException 中的异常
再次抛出异常,这是理想的行为。
但是为什么它在case-2中正常运行而没有抛出任何 ConcurrentModificationException。