java 集合类 arraylist 循环中删除特定元素的方法
这里有新鲜出炉的 Java 并发编程示例, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
下面小编就为大家带来一篇 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://www.phperz.com/article/18/0206/359442.html