ArrayList的几种遍历和删除

来源:互联网 发布:三星手机 数据恢复 编辑:程序博客网 时间:2024/06/06 08:49

建议使用迭代器来删除list中指定的元素

1.普通for循环

public static void main(String[] args) {        List<String> list=new ArrayList<String>();        list.add("one");        list.add("two");        list.add("two");        list.add("two");        list.add("two");        for(int i=0;i<list.size();i++){            if(list.get(i).equals("two")){                list.remove(i);            }        }        System.out.println(list);    }

输出结果:

[one, two, two]

分析:
list中有四个”two”,但是为什么结果还有2个”two”呢?
普通for遍历,当遍历到第一个”two”的时候匹配上, 删除第一个”two”。这时候,索引指向下一个”two”,并执行i++操作,从而导致第二个”two”没法被删掉。

改进方法:

for (int i = 0; i < list.size(); i++) {            if(list.get(i).equals("two")){                list.remove(i);                i--;        }

为避免错误,不建议使用这种方法来处理。建议使用迭代器来删除指定元素。

第二种方法 增强for

public static void main(String[] args) {        List<String> list=new ArrayList<String>();        list.add("one");        list.add("two");        list.add("two");        list.add("two");        list.add("two");        for(String s:list){            if(s.equals("two")){                list.remove(s);            }        }        System.out.println(list);    }

输出结果:

Exception in thread “main” java.util.ConcurrentModificationException

分析:增强for循环不能对集合本身进行操作

第三种方法 迭代器

public static void main(String[] args) {        List<String> list=new ArrayList<String>();        list.add("one");        list.add("two");        list.add("two");        list.add("two");        list.add("two");        //这里使用ListIterator也可以删除成功        Iterator<String> iterator=list.iterator();        while (iterator.hasNext()){            String s=iterator.next();            if(s.equals("two")){                iterator.remove();            }        }        System.out.println(list);    }

输出结果:

[one]

分析:
而迭代器不会有这样的问题是因为hasNext()方法,原理是指针向后移动,每运行一次it.next(),指针向后移动一次,一个一个的遍历。

阅读全文
0 0
原创粉丝点击