Java集合類ArrayList循環中刪除特定元素


在項目開發中,我們可能往往需要動態的刪除ArrayList中的一些元素。

一種錯誤的方式:

<pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){  
 
  if(list.get(i)==XXX){  
 
       list.remove(i);  
 
  }  
 
} 

 

上面這種方式會拋出如下異常:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 
    at java.util.ArrayList.RangeCheck(Unknown Source)  
    at java.util.ArrayList.get(Unknown Source)  
    at ListDemo.main(ListDemo.java:20) 

因為你刪除了元素,但是未改變迭代的下標,這樣當迭代到最后一個的時候就會拋異常咯。

可以對上面的程序進行如下改進:

for(int i = 0 , len= list.size();i<len;++i){  
 
  if(list.get(i)==XXX){  
 
       list.remove(i);  
       --len;//減少一個  
  }  
 
} 

上面的代碼就正確了。

下面我們再介紹一種方案:

List接口內部實現了Iterator接口,提供開發者一個iterator()得到當前list對象的一個iterator對象。

Iterator<String> sListIterator = list.iterator();  
while(sListIterator.hasNext()){  
    String e = sListIterator.next();  
    if(e.equals("3")){  
    sListIterator.remove();  
    }  
} 

上面這種也是正確的,並推薦使用第二種方案。

兩種方案實現原理都差多的,第二種只是jdk封裝了下。

查看ArrayList源碼會發現很多方法內部都是基於iterator接口實現的,所以推薦使用第二種方案。

原文鏈接:http://blog.csdn.net/lazy_p/article/details/7365324


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM