我是靠谱客的博主 傻傻狗,最近开发中收集的这篇文章主要介绍Iterator使用及ArrayList遍历注意事项,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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();
            }

        }
    }

最后

以上就是傻傻狗为你收集整理的Iterator使用及ArrayList遍历注意事项的全部内容,希望文章能够帮你解决Iterator使用及ArrayList遍历注意事项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部