遍歷List 同時 remove 元素
- List<Integer> list = new ArrayList<Integer>();
- list.add(1);
- list.add(2);
- list.add(3);
- list.add(4);
- list.add(5);
- list.add(6);
- for (Iterator<Integer> iter = list.iterator(); iter.hasNext();)
- {
- int i = iter.next();
- if (i == 3)
- {
- list.remove(i);
- }
- }
執行上邊的程式碼就會報錯:
API中此異常的解釋:當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。
原因:
Iterator 是工作在一個獨立的執行緒中,並且擁有一個 mutex 鎖。 Iterator 被建立之後會建立一個指向原來物件的單鏈索引表,當原來的物件數量發生變化時,這個索引表的內容不會同步改變,所以當索引指標往後移動的時候就找不到要迭代的物件,所以按照 fail-fast 原則 Iterator 會馬上丟擲 java.util.ConcurrentModificationException 異常。
所以 Iterator 在工作的時候是不允許被迭代的物件被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除物件, Iterator.remove() 方法會在刪除當前迭代物件的同時維護索引的一致性。
網上找的解決方法:
1.倒過來遍歷list
- for (int i = list.size()-1; i >=0; i--)
- {
- int item = list.get(i);
- if (item == 3)
- {
- list.remove(item);
- }
- }
2.每移除一個元素以後再把i移回來
- for (int i = 0; i < list.size(); i++)
- {
- int item = list.get(i);
- if (item == 3)
- {
- list.remove(item);
- i=i-1;
- }
- }
3.使用iterator.remove()方法刪除
- for (Iterator<Integer> iter = list.iterator(); iter.hasNext();)
- {
- int item = iter.next();
- if (item == 3)
- {
- iter.remove();
- }
- }
相關文章
- jsp頁面中同時遍歷多個list集合JS
- Lambda 表示式遍歷集合時用remove方法刪除list集合中滿足條件的元素問題REM
- jQuery 元素操作——遍歷元素jQuery
- java list最優遍歷Java
- DOM元素的遍歷
- Jquery之遍歷元素jQuery
- 在flask中同時遍歷兩個list中的資料並一一對應顯示Flask
- hashmap遍歷時用map.remove方法為什麼會報錯?HashMapREM
- java List<HashMap<String,Object>> 遍歷修改JavaHashMapObject
- 集合框架(List儲存字串並遍歷)框架字串
- HashSet 新增/遍歷元素原始碼分析原始碼
- JavaScript遍歷陣列每一個元素JavaScript陣列
- java陣列如何遍歷全部的元素Java陣列
- Remove-duplicates-from-sorted-listREM
- Java List的remove()方法陷阱JavaREM
- puppeteer 頁面爬取例項(元素遍歷)
- Python字典的遍歷,包括key遍歷/value遍歷/item遍歷/Python
- Python中使用 for 迴圈來拿遍歷 List 的值Python
- jQuery遍歷array陣列元素程式碼例項jQuery陣列
- Python優雅遍歷字典刪除元素的方法Python
- Leetcode 203. Remove Linked List ElementsLeetCodeREM
- LeetCode | 203. Remove Linked List ElementsLeetCodeREM
- list列表運算子,列表元素的遍歷,列表的方法,生成列表,巢狀的列表|python自學筆記(四)巢狀Python筆記
- Leetcode 19 Remove Nth Node From End of ListLeetCodeREM
- [LeetCode] 2487. Remove Nodes From Linked ListLeetCodeREM
- LeetCode 83. Remove Duplicates from Sorted ListLeetCodeREM
- 【程式碼優化】List.remove() 剖析優化REM
- Python新手常見問題五:在遍歷列表的同時又修改該列表Python
- golang遍歷channel時return問題Golang
- 騰訊一面!說說ArrayList的遍歷foreach與iterator時remove的區別,我一臉懵逼REM
- MyBatis的XML配置:如何判斷List為空並遍歷拼接MyBatisXML
- [js] 根據元素ID遍歷樹形結構,查詢到所有父元素IDJS
- js的map遍歷和array遍歷JS
- java8 對list集合中的物件遍歷,重新賦值兩種方法,遍歷某個屬性返回陣列Java物件賦值陣列
- python迴圈遍歷字典: title_content_list.append([key, value])print(tiPythonAPP
- Remove Duplicate Letters 刪除重複元素REM
- Java ArrayList 查詢、刪除指定元素;排序;遍歷;隨機獲取元素等常用操作Java排序隨機
- 遍歷 FlowDocument
- Linuxshell遍歷Linux