2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
List.remove()
ConcurrentModificationException
當(dāng)它從列表中刪除倒數(shù)第二個(gè)元素時(shí)不會(huì)拋出。
當(dāng)集合框架被添加到平臺時(shí),每次迭代檢查一次而不是兩次的共同修改被認(rèn)為太昂貴了;檢查是在 Iterator.next 而不是 Iterator.hasNext 上進(jìn)行的。專家審稿人認(rèn)為這已經(jīng)足夠了。他們不知道它未能檢測到一個(gè)重要的情況:如果在迭代中最后一次調(diào)用 hasNext 之前立即從列表中刪除了一個(gè)元素,則該調(diào)用將返回 false 并且迭代終止,默默地忽略列表中的最后一個(gè)元素。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
有兩種方法用于迭代集合:枚舉和迭代器。
第一個(gè)允許在迭代期間修改集合(慢速失?。?,第二個(gè)不允許(快速失敗)。在 for-each 循環(huán)中,您使用的是迭代器,因此在迭代期間對集合的任何修改都會(huì)導(dǎo)致異常。
您有 3 個(gè)選擇來解決這個(gè)問題:
改用迭代器:
Iterator<String> bookIt = listOfBooks.iterator();
while(bookIt.hasNext()){
String book = bookIt.next();
if (book.contains("Java")) {
bookIt.remove();
}
}
創(chuàng)建一個(gè)僅包含可接受元素的新列表(過濾掉不需要的元素):
List<String> booksWithNoCode = listOfBooks.stream()
.filter(book-> !book.contains("Code"))
.collect(toList())
使用Collection.removeIf(),您將從列表中刪除所有符合給定條件的元素。
listOfBooks.removeIf(book-> book.contains("Code"))
您可以在這篇文章和這里找到更多信息。
添加回答
舉報(bào)