Iterator使用及ArrayList遍历注意事项

来源:互联网 发布:淘宝宝贝分类在哪里 编辑:程序博客网 时间:2024/05/22 03:07

Iterator使用及ArrayList遍历注意事项

(一)Iterator

  • Iterator接口是java集合框架成员,Iterator主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
  • Iterator接口隐藏了各种Collection实现类的底层细节,功能比较简单,并且只能单向移动。

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

(二)ArrayList遍历注意事项

  • 【切记】Iterator对象的remove方法是迭代过程中删除元素的唯一方法
  • 下面我们来看ArrayList遍历中的陷阱:
import java.util.ArrayList;public class ArrayListRemove {    public static void main(String[] args)    {        ArrayList<String> list = new ArrayList<String>();        list.add("a");        list.add("b");        list.add("b");        list.add("c");        list.add("c");        list.add("c");        remove(list);        for (String s : list)         {            System.out.println("element : " + s);        }    }    public static void remove(ArrayList<String> list)     {        // TODO:    }

如果要想删除list的b字符,有下面两种常见的错误例子:

  • 错误写法实例一
public static void remove(ArrayList<String> list)     {        for (int i = 0; i < list.size(); i++)         {            String s = list.get(i);            if (s.equals("b"))             {                list.remove(s);            }        }    }
  • 错误的原因:这种最普通的循环写法执行后会发现第二个“b”的字符串没有删掉。

  • 错误写法实例二:

public static void remove(ArrayList<String> list)     {        for (String s : list)        {            if (s.equals("b"))             {                list.remove(s);            }        }    }
  • 错误的原因:这种for-each写法会报出著名的并发修改异常:java.util.ConcurrentModificationException。

    -先解释一下实例一的错误原因:针对错误写法一,在遍历第一个字符串b时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动(也就是第二个字符串b)至当前位置,导致下一次循环遍历时后一个字符串b并没有遍历到,所以无法删除。针对这种情况可以倒序删除的方式来避免:

public static void remove(ArrayList<String> list)     {        for (int i = list.size() - 1; i >= 0; i--)         {            String s = list.get(i);            if (s.equals("b"))             {                list.remove(s);            }        }    }
  • 因为数组倒序遍历时即使发生元素删除也不影响后序元素遍历。

  • 对于第二种的解释是:在对Collection类进行迭代时,要调用删除元素时必须调用Iterator的remove()方法,而不能调用Collection的remove()方法。所以正确的迭代方法是下面的代码所示:

public static void remove(ArrayList<String> list)     {        Iterator it = list.iterator();        while(it.hasNext()){            String s = it.next();            if( s.equals("b")){                it.remove();            }        }    }
0 0
原创粉丝点击