我正在开发一个包含遗留代码的应用程序。这里有一个链表,代码在while循环中使用迭代器迭代该链表。
LinkedList ll = grammarSection.getSectionsAsLinkList();
Iterator iter = ll.iterator();
int i=0;
while (iter.hasNext()) {
1. GrammarSection agrammarSection = (GrammarSection) iter.next();
2. grammarLineWithMatches = m_grammarLineMatcher.getMatch(agrammarSection, p_line);
3. if (grammarLineWithMatches != null) { //condition a
4. if (getPeek(ll)!=agrammarSection)
5. ll.addFirst(ll.remove(i)); //changing the linkedlist Line5
return grammarLineWithMatches;
}
i++;
}
在while循环中,如果条件a为真,则链接列表将按照第5行进行修改。但是,在这种情况下,line1上的下一个方法会抛出ConcurrentModificationException。如何在不获取任何ConcurrentModificationException的情况下添加和删除链接列表
答案 0 :(得分:2)
您无法更改当前正在迭代的集合。你可以:
list.size()
。但是使用LinkedList
这效率不高。如果只是关于移除,您可以使用iter.remove()
,但您也有addFirst(..)
答案 1 :(得分:1)
简短的回答是:你做不到。
JDK的List
实现被设计为由迭代器修改,以保持迭代的顺序(没有办法判断任意列表更改是否会这样做,因此迭代器假设最坏)。
在您的情况下,解决方案是创建一个新的LinkedList
。在迭代时,要么将迭代元素添加到新列表的结尾或开头。然后扔掉旧的。
答案 2 :(得分:1)
迭代器是故障快速迭代器,所以它可能会抛出ConcurrentModificationException。
最简单的解决方案是;
而不是在迭代时从列表中删除项目,将要删除的项目添加到新列表中,在循环之后,您可以使用removeAll列表方法删除所有这些项目。
反之亦然,保留您需要保留的内容并将新列表分配给旧列表