Java碼農必須掌握的迴圈刪除List元素的正確方法
轉載自 Java碼農必須掌握的迴圈刪除List元素的正確方法
首先看下下面的各種刪除list元素的例子
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("a1", "ab2", "a3", "ab4", "a5", "ab6", "a7", "ab8", "a9"));
/**
* 報錯
* java.util.ConcurrentModificationException
*/
for (String str : list) {
if (str.contains("b")) {
list.remove(str);
}
}
/**
* 報錯:下標越界
* java.lang.IndexOutOfBoundsException
*/
int size = list.size();
for (int i = 0; i < size; i++) {
String str = list.get(i);
if (str.contains("b")) {
list.remove(i);
}
}
/**
* 正常刪除,每次呼叫size方法,損耗效能,不推薦
*/
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.contains("b")) {
list.remove(i);
}
}
/**
* 正常刪除,推薦使用
*/
for (Iterator<String> ite = list.iterator(); ite.hasNext();) {
String str = ite.next();
if (str.contains("b")) {
ite.remove();
}
}
/**
* 報錯
* java.util.ConcurrentModificationException
*/
for (Iterator<String> ite = list.iterator(); ite.hasNext();) {
String str = ite.next();
if (str.contains("b")) {
list.remove(str);
}
}
}
報異常IndexOutOfBoundsException我們很理解,是動態刪除了元素導致陣列下標越界了。
那ConcurrentModificationException呢?
其中,for(xx in xx)是增強的for迴圈,即迭代器Iterator的加強實現,其內部是呼叫的Iterator的方法,為什麼會報ConcurrentModificationException錯誤,我們來看下原始碼
取下個元素的時候都會去判斷要修改的數量和期待修改的數量是否一致,不一致則會報錯,而通過迭代器本身呼叫remove方法則不會有這個問題,因為它刪除的時候會把這兩個數量同步。搞清楚它是增加的for迴圈就不難理解其中的奧祕了。
相關文章
- list增強for迴圈刪除元素報錯
- list中for迴圈刪除多個元素為何報錯?
- 反直覺正迴圈刪除
- MYSQL日誌的正確刪除方法詳解MySql
- for迴圈無法刪除陣列所有指定元素陣列
- 【Java】增強for迴圈,三種迭代的能否刪除Java
- Java必須掌握的Spring常用註解JavaSpring
- 在ArrayList的迴圈中刪除元素,會不會出現問題?
- python迴圈刪除漏洞Python
- J2SE-刪除List集合元素
- Linux必須掌握的shell指令碼基礎Linux指令碼
- win10系統正確刪除packages資料夾的方法Win10Package
- SQL Server正確刪除Windows認證使用者的方法教程SQLServerWindows
- K8s必須掌握的7個除錯技巧K8S除錯
- Python列表刪除元素的方法有哪些?Python
- Git中~你必須掌握的!Git
- 9個必須掌握的Javascript處理陣列的方法JavaScript陣列
- MySQL 正確刪除 binlog 日誌MySql
- JVM-Java工程師必須掌握的知識點JVMJava工程師
- PHP從陣列中刪除元素的方法PHP陣列
- Python 中刪除列表元素的三種方法Python
- RMAN正確地刪除Archivelog以及設定有備庫的歸檔刪除策略Hive
- 在迴圈陣列時使用splice()方法刪除陣列遇到的問題陣列
- 必須要掌握的重要目錄
- 必須掌握的10個Linux命令!Linux
- 前端必須掌握的知識點前端
- CSS中那些必須掌握的概念CSS
- 學習Linux必須掌握的命令!Linux
- Java程式設計師必須掌握的5個註解!Java程式設計師
- java開發必須要掌握的20個核心技術Java
- Java開發必須掌握的線上問題排查命令Java
- Java程式設計師必須掌握的7個Java效能指標!Java程式設計師指標
- 高階JAVA碼農必須搞清楚它們的區別:instanceof、isInstance、isAssignableFromJava
- Python優雅遍歷字典刪除元素的方法Python
- JS刪除陣列裡的某個元素方法JS陣列
- 【廖雪峰python入門筆記】list刪除元素_pop()Python筆記
- Java經典常用類總結(必須掌握!)Java
- PMD外掛:你必須掌握的程式碼質量工具!