1. 程式人生 > >java中集合刪除元素的兩種常用方式及新手易錯

java中集合刪除元素的兩種常用方式及新手易錯

java中集合刪除元素的兩種常用方式及新手易錯:

建立集合:

[java]  view plain  copy
  1. ArrayList<String> aList = new  ArrayList<String>();  
  2.         aList.add("a");  
  3.         aList.add("b"
    );  
  4.         aList.add("c");  
  5.         aList.add("abc");  
  6.         aList.add("abc");  
  7.         aList.add("abc"
    );  
  8.         aList.add("eye");  
  9.         aList.add("opp");  
  10.         aList.add("abc");  

1、第一種刪除方式(利用for迴圈刪除):

[java]
  view plain  copy
  1. for (int i = 0; i < aList.size(); i++) {  
  2. if ("abc".equals(aList.get(i))) {  
  3. aList.remove(i--);// 索引回溯  
  4. }  
  5. }  

//和上面一樣,換一種方式(易觀看)

for (int i = 0; i < aList.size(); i++) {  
   if ("abc".equals(aList.get(i))) {  
       aList.remove(i);
        i--;// 索引回溯  
    }  
}





2、第二種刪除方法(利用迭代器的remove()方法刪除

[java]  view plain  copy
  1. ListIterator<String> listIterator = aList.listIterator();  
  2.         while(listIterator.hasNext()){  
  3.             String  str = listIterator.next();  
  4.             if ("abc".equals(str)) {  
  5.               //aList.remove(str);   // 集合自身的remove()方法刪除  
  6.                 listIterator.remove(); //迭代器的remove() 方法刪除  
  7.             }  
  8.         }  

執行結果:

[java]  view plain  copy
  1. 原集合:a b c abc abc abc eye opp abc   
  2. 刪除後集合:a b c eye opp   


新手易錯點:

1、利用for迴圈刪除時索引沒有回溯,導致漏刪元素

[java]  view plain  copy
  1. for(int i = 0 ;i < aList.size(); i++){  
  2.             if("abc".equals(aList.get(i))){  
  3.                 aList.remove(i);// 索引回溯  
  4.             }  
  5.         }  


 執行結果:
 
 

[java]  view plain  copy
  1. 原集合:a b c abc abc abc eye opp abc   
  2. 刪除後集合:a b c abc eye opp   

2、使用迭代器迴圈刪除元素時,沒有利用迭代器remove方法刪除元素而是利用集合自身的remove方法刪除元素,

這樣會導致“併發修改異常錯誤”

[java]  view plain  copy
  1. ListIterator<String> listIterator = aList.listIterator();  
  2.         while(listIterator.hasNext()){  
  3.             String  str = listIterator.next();  
  4.             if ("abc".equals(str)) {  
  5.                 aList.remove(str);   // 集合自身的remove()方法刪除  
  6.             }  
  7.         }  
執行結果:

[java]  view plain  copy
  1. 原集合:a b c abc abc abc eye opp abc   
  2. 刪除後集合:Exception in thread "main" java.util.ConcurrentModificationException  
  3.     at java.util.ArrayList$Itr.checkForComodification(Unknown Source)  
  4.     at java.util.ArrayList$Itr.next(Unknown Source)  
  5.     at practice_2.Mianpractice2.main(Mianpractice2.java:42)  


併發修改異常錯誤的產生是因為在生成迭代器後迭代器就已經確定了集合的長度size了,而後集合刪除元素後集合的size變小,但是迭代器任然記錄的是之前的size資料在迭代過程中產生併發修改異常ConcurrentModificationException,但是如果是使用迭代器的remove()方法來刪除元素的話則不會產出這個問題,因為迭代器中的cursor能夠自動適應元素刪除後集合大小的變化;

所以在刪除集合元素時,如果適應迭代器來迴圈集合元素一定要使用迭代器自身的remove()方法來刪除元素;


轉載出處:https://blog.csdn.net/u014143369/article/details/52996154