Java 集合中三种遍历的删除 - Go语言中文社区

Java 集合中三种遍历的删除


  在集合中有三种遍历方式 for循环,迭代器,和foerach  这三种在删除中方式一样吗?

下面分别对其进行探讨 

1 for循环 

for循环是一种普遍的循环,有索引 下面通过代码进行了解 


 
import java.util.ArrayList;
public class DeleteDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        array.add(2);
        array.add(3);
        for(int i=0;i<array.size();i++){
            if(2==array.get(i)){
                array.remove(i);
            }
        }
}}

 

 

看看运行结果

 

 

为什么 有一个2 没有被删除呢,当我们深究 for循环在集合中工作原理就可以理解,事实上,当删除一个元素时,后面元素的索引就会前进以为,如删除第一个2 时候,此时下一个元素2的索引就变成了1,而此时for循环执行i++,对应索引的位置为2 而新的1索引上的值就不会在读取了,所以结果为【1,2,3】,要解决这个问题很容易只需要把 array.remove(i);改为 array.remove(i);即可 即


 
import java.util.ArrayList;
public class DeleteDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        array.add(2);
        array.add(3);
        for(int i=0;i<array.size();i++){
            if(2==array.get(i)){
                array.remove(i--);
            }
        }
}}

 

输出结果为

 

2迭代器Iterator遍历删除

iterator方法是集合中的方法,通过代码即可清楚了解

import java.util.ArrayList;
import java.util.Iterator;
public class DeleteDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        array.add(2);
        array.add(3);
        Iterator<Integer> it = array.iterator();
        while (((Iterator) it).hasNext()){
            if (2==it.next()){
                it.remove();
            }
        }
        System.out.println(array);}}

结果是

我们发现我们用的remove()方法是迭代器的 事实上集合也有remove()方法,如果我们用集合的remove()方法会怎么样呢  下面直接给出结果

意思是迭代器并发修改异常,出现这个原因是 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection(来自java API),从这里可以看出迭代器和集合是在不同线程里的。查看资料知道了,迭代器其实在另外一个线程复制了一个一摸一样的集合进行遍历的。当用集合的remove方法删除元素时,迭代器是不会知道的,所以就会抛出异常。而用自己的方法时 迭代器时知道的。

我们再接着看上述代码,我们想如果是想分别打印出元素,不包括删除的元素怎么办,这时候我们可能想到下列代码 

import java.util.ArrayList;
import java.util.Iterator;
public class DeleteDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        array.add(2);
        array.add(3);
        Iterator<Integer> it = array.iterator();
        while (((Iterator) it).hasNext()){
            if (2==it.next()) {
                it.remove();
            }
                System.out.println(it.next());

        }

   结果是  

为什么是这样呢,那是因为我们用了两次it.next()  那么要想满足条件该怎么办呢?  看了上次错误原因我们想只用一个it.next()就好了。此时修改下代码即可解决


 
import java.util.ArrayList;
import java.util.Iterator;
public class DeleteDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        array.add(2);
        array.add(3);
        Iterator<Integer> it = array.iterator();
        while (((Iterator) it).hasNext()) {
            int b = it.next();
            if (2 != b) {
                it.remove();
                System.out.println(b);
            }
        }
    }
}

 

结果是 

  3 foreach循环

foreach循环一种很方便的循环 但是没有索引 那么可以在集合中可以修改吗? 很遗憾不可以 我们用代码演示下

import java.util.ArrayList;
public class DeleteDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        array.add(2);
        array.add(3);
        for (Integer a:array) {
            if (2==a){
                array.remove(a);
            }
            System.out.println(a);
        }
    }
}

结果是

   这个原因我们解释过  因为它自身不带删除方法,所以 这个不可以删除元素。

总结:在只是便利情况下,我们三个都可以用,在修改集合的情况下,不用第三个foreach

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42329657/article/details/81005251
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 02:08:28
  • 阅读 ( 1058 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢