編寫一個方法removeEvenLength,它將一組字符串作爲參數,並從集合中刪除所有長度均勻的字符串。這段代碼爲什麼會拋出ConcurrentModificationException?
我的解決辦法:
public static void removeEvenLength(Set<String> set) {
for(String word : set) {
if(word.length() % 2 == 0) {
set.remove(word);
}
}
}
輸入: [foo, buzz, bar, fork, bort, spoon, !, dude]
輸出:
ConcurrentModificationException on line 2:
java.util.ConcurrentModificationException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1115)
at java.util.TreeMap$KeyIterator.next(TreeMap.java:1169)
at removeEvenLength (Line 2)
這樣我就可以通過創建一個Iterator
解決這個問題。但我想知道爲什麼上面的代碼不起作用?
編輯:
迭代器無法正常工作或:
public static void removeEvenLength(Set<String> set) {
Iterator<String> i = set.iterator();
while(i.hasNext()) {
String word = i.next();
if(word.length() % 2 == 0) {
set.remove(word);
}
}
}
同樣的錯誤。
「爲什麼」:集合java.util中不是線程安全的。正因爲如此,他們添加了一個檢查來測試在迭代器中詢問下一個項目時集合是否發生了變化。如果是這樣,它會拋出ConcurrentModification異常。使用Iterator.remove是安全的,因爲它是執行步行和刪除的同一個對象。 –
您的方法簽名可能應該更改爲'public static void removeEvenLength(Collection strings)',因爲這樣可以使用_any_類的集合('Iterable strings'也是一個選項)。 –