Java動態 遍曆List 時刪除List特徵元素 異常問題 及解決方式總結

來源:互聯網
上載者:User

標籤:java   基礎   list   集合   遍曆   

首先,這是一個極其簡單的問題,大牛可忽略,新手可能會遇到,Java中遍曆某個List 時刪除該List元素 會拋出異常。


這一個簡單的問題再高手嚴重不值一提,但新手可能會比較困惑,用哪種方式可以安全有效實現遍曆list刪除某些特徵元素?

方式:

方法1、普通for迴圈 遍曆List,刪List除自身 特徵條目;

方法2、進階for迴圈 遍曆List,刪除List自身 特定條目;

方法3、引入參考List,for迴圈遍曆刪除原List 特定條目;

方法4、利用iterator 遍曆刪除List特定條目


結論:

方法1:不會拋異常 但結果 未必正確 由於list.size()在變動 根據腳標刪除的未必是 特徵元素;

方法2:會拋異常 :java.util.ConcurrentModificationException;

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)

方法3:可實現目的,通過引入一個參考list for迴圈遍曆參考list 在迴圈過程中 滿足條件出 刪除原list條目,可以達到所需目的;

方法4:可實現目的,通過list.iterator();方法拿到iterator對象 調用iterator.remove();方法可達到所需目的且不會拋異常。



這個問題 最好親自運行代碼,嘗試,方能更好理解。


不廢話,上代碼,自己運行一下便可:

package com.kevin.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Random;/** * 動態刪除 List 特徵元素 樣本 *  * @author blj *  */public class TestMain{static class Bean{private String name;public String getName(){return name;}public void setName(String name){this.name = name;}}/** * @param args */public static void main(String[] args){dynamicRemoveItemFromListDemo();}/** * 動態刪除List元素樣本 */public static void dynamicRemoveItemFromListDemo(){List<Bean> list = getList();System.out.println("未經處理資料:");printList(list);// 使用普通for迴圈遍曆List刪除自身元素 不報錯 但結果 未必正確normalRemoveMethod(list);// 使用進階for迴圈遍曆List刪除自身元素 報錯// try// {// superRemoveMethod(list);// }// catch (Exception e)// {// System.err.println("進階for迴圈報錯:");// e.printStackTrace();// }// 引入參考List 遍曆刪除方法// referenceRemoveMethod(list);// iterator遍曆刪除方法// iteratorRemoveMethod(list);System.out.println("結果資料:");printList(list);}/** * 列印 List 方法 *  * @param list */private static void printList(List<Bean> list){for (Bean item : list){System.out.print(item.getName() + " ");}System.out.println();}/** * 利用普通for迴圈遍曆刪除元素 *  * @param list */private static void normalRemoveMethod(List<Bean> list){for (int i = 0; i < list.size(); i++){if (list.get(i).getName().equals("A")){list.remove(list.get(i));}}}/** * 利用進階for迴圈遍曆刪除元素(會報異常) *  * @param list */private static void superRemoveMethod(List<Bean> list){// 方法一for (Bean item : list){if (item.getName().equals("A")){list.remove(item);}}}/** * 有效for迴圈遍曆刪除元素(正常 達到預期目的) *  * @param list */private static void referenceRemoveMethod(List<Bean> list){List<Bean> referenceList = new ArrayList<Bean>();referenceList.addAll(list);for (int i = 0; i < referenceList.size(); i++){if (referenceList.get(i).getName().equals("A")){list.remove(referenceList.get(i));}}}/** * 使用Iterator的方式也可以順利刪除和遍曆 */public static void iteratorRemoveMethod(List<Bean> list){Iterator<Bean> it = list.iterator();while (it.hasNext()){Bean student = it.next();if (student.getName().equals("A"))it.remove();}}/** * 擷取List方法 *  * @return */private static List<Bean> getList(){List<Bean> list = new ArrayList<Bean>();for (int i = 0; i < 50; i++){Bean item = new Bean();int j = i + new Random().nextInt();if (j % 3 == 1){item.setName("A");}else if (j % 3 == 2){item.setName("B");}else{item.setName("C");}list.add(item);}return list;}}





Java動態 遍曆List 時刪除List特徵元素 異常問題 及解決方式總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.