gpt4 book ai didi

java - 迭代器添加到数组列表的并发修改异常

转载 作者:行者123 更新时间:2023-12-01 17:06:36 24 4
gpt4 key购买 nike

我正在尝试使用迭代器将整数添加到数组列表中。它在第三次调用迭代器的 .next() 时崩溃。这是堆栈跟踪和代码

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:886)
at java.util.ArrayList$Itr.next(ArrayList.java:836)
at quicksort.test.generateSorted(test.java:33)
at quicksort.test.main(test.java:17)
Java Result: 1


public static int[] generateSorted(final int length, final int minVal, final int maxVal)
{
ArrayList<Integer> data = new ArrayList<>(length);
data.add(getRandomVal(minVal, maxVal));
ListIterator<Integer> itr = data.listIterator();
boolean added;
for(int i = 0; i < length; i++)
{
added = false;
int rndNum = getRandomVal(minVal, maxVal);
while(itr.hasNext() && !added)
{

System.out.println(rndNum);
Integer currentNum = itr.next();
if(currentNum >= rndNum)
{
itr.add(rndNum);
added = true;
}
}

if(!added)//add to end of arrayList
data.add(rndNum);
}

return data.stream().mapToInt(i -> i).toArray();
}

项目中的所有内容都是单线程的,怎么可能是并发修改呢?如果迭代器无法添加

顺便说一句,new ArrayList<>(size) 和 new ArrayList(size) 有什么区别? Netbeans 给了我第二个警告,但仍然可以正常编译。

编辑:哎呀打字错误,我还想问 ArrayList(size) 有什么区别

最佳答案

异常是由于您在仍然使用迭代器的同时修改了列表。迭代器需要维护调用之间的状态以跟踪它的位置。如果修改了底层List,Iterator的状态就会变得无效,并且不再保证正确的操作。这意味着当您当前使用迭代器时,不能使用任何修改列表的方法。您仍然可以通过迭代器修改列表,因为迭代器现在可以维护其内部状态并保证以后调用迭代器时的正确操作。

有几种解决方案可以解决您的问题。第一个是每次编辑基础列表时重新创建迭代器。无论如何,您都应该这样做,因为您似乎正在尝试保持列表的排序,如果您不从头开始,您将无法进行良好的排序。第二种解决方案是将所有数字添加到列表中,然后使用类似 Collections.sort 的内容对其进行排序。

解决方案 1:

List< Integer > list = new ArrayList<>();
for( int i = 0; i < length; i++ ) {
Iterator< Integer > itr = list.listIterator();
// Generate and add number to list
}

解决方案 2:

List< Integer > list = new ArrayList<>();
for( int i = 0; i < length; i++ ) {
int num = ...; // Generate number
list.add( num );
}
Collections.sort( list );

该警告是因为您没有向泛型类提供泛型参数。当您添加“<>”时,它就会消失,因为这告诉编译器推断通用参数。最近添加它是为了减少创建此类内容所需的代码量。

List< Map< String, Map< String, List< String > > > > list1 = new ArrayList< Map< String, Map< String, List< String > > > >();
// Becomes
List< Map< String, Map< String, List< String > > > > list2 = new ArrayList<>();

关于java - 迭代器添加到数组列表的并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25313871/

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