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迴圈刪除多個元素為何報錯?
- Java ArrayList刪除特定元素的方法Java
- Java Annotation 必須掌握的特性Java
- MYSQL日誌的正確刪除方法詳解MySql
- for迴圈無法刪除陣列所有指定元素陣列
- 文件中根元素後面的標記格式必須正確。
- 【Java】增強for迴圈,三種迭代的能否刪除Java
- ORACLE正確刪除歸檔並回收空間的方法Oracle
- 在ArrayList的迴圈中刪除元素,會不會出現問題?
- Java必須掌握的Spring常用註解JavaSpring
- python迴圈刪除漏洞Python
- Java刪除ArrayList中的重複元素的2種方法Java
- [破除迷信]java.util.ArrayList在foreach迴圈遍歷時可以刪除元素Java
- SQL Server正確刪除Windows認證使用者的方法教程SQLServerWindows
- win10系統正確刪除packages資料夾的方法Win10Package
- J2SE-刪除List集合元素
- Git中~你必須掌握的!Git
- Linux必須掌握的shell指令碼基礎Linux指令碼
- 9個必須掌握的Javascript處理陣列的方法JavaScript陣列
- mybatis異常 :元素內容必須由格式正確的字元資料或標記組成。MyBatis字元
- Java開發必須掌握的線上問題排查命令Java
- Java 程式設計師必須掌握的 Linux 命令Java程式設計師Linux
- CSS中那些必須掌握的概念CSS
- 前端必須掌握的知識點前端
- 在迴圈陣列時使用splice()方法刪除陣列遇到的問題陣列
- 正規表示式刪除Java程式碼中的註釋Java
- java開發必須要掌握的20個核心技術Java
- JVM-Java工程師必須掌握的知識點JVMJava工程師
- 【4】進大廠必須掌握的面試題-Java面試-jdbc面試題JavaJDBC
- Java程式設計師必須掌握的5個註解!Java程式設計師
- Java程式設計師面試必須要掌握的面試題Java程式設計師面試題
- MySQL 正確刪除 binlog 日誌MySql
- javascript刪除陣列元素的程式碼JavaScript陣列
- 《迴圈英雄》《殺戮尖塔》開發者親談:什麼才是遊戲的“正確”設計方法?遊戲
- Java程式設計師必須掌握的7個Java效能指標!Java程式設計師指標
- Python列表刪除元素的方法有哪些?Python
- PHP從陣列中刪除元素的方法PHP陣列