JAVA中循环删除list中元素方法及总结

2018-09-04  本文已影响0人  Android砖家

JAVA中循环遍历list有三种方式:

  • 1.for循环、
  • 2.增强for循环(也就是常说的foreach循环)。
  • 3.iterator遍历。

第一种:for循环遍历删除元素:
public class Test {
    public static void main(String[] args) {
        List<String> lists=new ArrayList();
        lists.add("111111111");
        lists.add("222222222");
        lists.add("333333333");
        lists.add("4444444444");
        lists.add("555555555555");
        lists.add("6666666666");
        lists.add("7777777777");
        lists.add("88888888888");
        lists.add("9999999999");
//      1、for循环遍历list
        for (int i = 0; i < lists.size(); i++) {        
            System.out.println(lists.remove(i));
        }
    }
}

嗯,看上去似乎没啥毛病,请看打印结果:


yhx.png

分析:从结果看,相邻之间删除数据,代码明明是依次循环删除数据。怎么会相邻删除数据呢?

原因:

这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。(也就是索引移位引起的原因)


第二种:增强for循环
public class Test {
    public static void main(String[] args) {
        List<String> lists = new ArrayList();
        lists.add("111111111");
        lists.add("222222222");
        lists.add("333333333");
        lists.add("4444444444");
        lists.add("555555555555");
        lists.add("6666666666");
        lists.add("7777777777");
        lists.add("88888888888");
        lists.add("9999999999");
        // 2、增强for循环
        for (String x : lists) {
            System.out.println(lists.remove(x));
        }
    }
}

嗯,看似也好像没啥毛病,看结果:


yhx.png

分析:这个时候《有道》你值得拥有。每个程序员必备,

就像每个成功男人的背后,都有一部爱情动作片....(好像跑偏了)

看看这句错误是啥意思:

Exception in thread "main" java.util.ConcurrentModificationException

Concurrent =====> 并发的;一致的;同时发生的
Modification=====> 修改,修正;改变

不要问我翻译这么6,我也是有道过来的。
赶脚这样的翻译没啥毛病,哈哈哈,原因不就出来了么

原因:

删除元素后循环会继续报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。


3.第三种:iterator遍历
public class Test {
    public static void main(String[] args) {
        List<String> lists = new ArrayList();
        lists.add("111111111");
        lists.add("222222222");
        lists.add("333333333");
        lists.add("4444444444");
        lists.add("555555555555");
        lists.add("6666666666");
        lists.add("7777777777");
        lists.add("88888888888");
        lists.add("9999999999");
        // 3、iterator遍历
         Iterator<String> it = lists.iterator();
         while(it.hasNext()){
         String x = it.next();
         it.remove();
         System.out.println(x);
         }
    }
}

嗯,这个看上去也没毛病,这次蒙对了,真还没毛病:

yhx.png

综上所述:

(1)循环删除list中特定一个元素的,可以使用三种方式中的任意一种,但在使用中要注意上面分析的各个问题。
(2)循环删除list中多个元素的,应该使用迭代器iterator方式。
上一篇 下一篇

猜你喜欢

热点阅读