尚學堂 老師好!

上海:15201841284

廣州:020-2989 6995

深圳:0755-23061965

武漢:027-8798 9193

西安:029-8822 8155

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循環就不難理解其中的奧秘了。

  • 北京校區
  • 西安校區
  • 山西校區
  • 武漢校區
  • 深圳校區
  • 上海校區
  • 廣州校區
  • 保定招生辦
  • 黑龍江項目辦

北京京南校區:北京亦莊經濟開發區科創十四街6號院1號樓 賽蒂國際工業園
咨詢電話:400-009-1906 / 010-56233821
面授課程:?JavaEE+微服務+大數據? ???大數據+機器學習+平臺架構?????Python+數據分析+機器學習??人工智能+模式識別+強化學習???WEB前端+移動端+服務端渲染

地址:陜西省西安市高新區西安軟件園西區創新信息大廈A座三層尚學堂

電話:029-88228155 / 18291433445

山西學區地址:山西省晉中市榆次區大學城大學生活廣場萬科商業A1座702

武漢學區地址:武漢市東湖高新區光谷金融港B22棟11樓
咨詢電話:027-87989193

深圳校區地址:深圳市寶安區航城大道U8智造產業園U6棟3樓
咨詢電話:0755-23061965 / 18898413781

上海尚學堂校區地址:上海市浦東新區城豐路650號
咨詢電話:021-67690939

廣州校區地址:廣州市天河區車陂街道大崗路5號中僑廣場2棟321室(四號線車陂站D出口,或brt車陂站)
咨詢電話:18948349646

保定招生辦公室

地址:河北省保定市競秀區朝陽南大街777號鴻悅國際1101室

電話:15132423123

黑龍江項目辦
地點:哈爾濱市松北區博文路青年部落孵化器1層
電話:15321415678
Copyright 2006-2021 北京尚學堂科技有限公司  京ICP備13018289號-19  京公網安備11010802015183  
網站維護:北京尚學堂科技有限公司昌平分公司