JAVA中的ITERATOR和LISTITERATOR

在学习Java的时候,仅仅是只知道iterrator的,在面试的时候见到了listiterator,虽然明知道他们都是迭代器,但是对于他们之间的联系和区别却懵逼了,现在来记录下

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小

凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合;(Iterator接口定义了3个方法分别是hasNext(),next(),remove();)

我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了

集合分为两类,一类如list、set是按照单个元素存储的collection,一类是如map是以key—value存储的,两类集合体系,无论数据的存储和遍历都存在非常大的差异,所以我们在讨论iterrator和listiterator是指的list和set的中的应用

但是在使用的时候也是有不同的。List和Set都有iterator()来取得其迭代器。对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面

  • iterator()方法在set和list接口中都有定义(即iterator()是通用的,但是ListIterator()仅存在于list接口中(或实现类中);
  • Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法
  • ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以
  •  ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能
  • 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改

Iterator的简单实现

public class TestIterator {
    
    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<String>();
        list.add("我");
        list.add("爱");
        list.add("你");
        list.add("哈哈哈");
        System.out.println("修改之前的集合" + list);//以集合的方式打印

        for (Iterator iter = list.iterator();iter.hasNext(); ) {
            String str = (String) iter.next();
            System.out.println(str);
        }

        Iterator iter = list.iterator();
        while (iter.hasNext()) {
            String str = (String) iter.next();
//不能直接进行修改,会报java.util.ConcurrentModificationException异常
            if(str.equals("哈哈哈")){
                list.add("嘿嘿嘿");
            }
            System.out.println(str);
        }

    }
} 

 

方法 功能
hasNext() 判断集合列表中是否还有可以迭代的元素
next() 返回下一个元素
remove() 移除最近返回的一个元素

ListIterator的简单实现

public class TestIterator {

    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<String>();
        list.add("我");
        list.add("爱");
        list.add("你");
        list.add("哈哈哈");
        System.out.println("修改之前的集合" + list);

        ListIterator liter = list.listIterator();
        ;
        while (liter.hasNext()) {
            String str = (String) liter.next();
            if (str.equals("哈哈哈")) {
                int i = liter.nextIndex();
                System.out.println(i);
                //可以直接删除在添加,也可以用set方法
                liter.remove();
                liter.add("嘿嘿嘿");
            }
            System.out.println(list);
        }
    }
}

 

 

方法 功能
hasNext() 判断是否还有下一个元素可以迭代
next() 返回下一个元素
hasPrevious() 判断是否还有上一个元素可以迭代
previous() 返回上一个元素
add() 返回上一个元素
set(E e) 用指定的元素替换最近返回的元素
remove() 移除最近返回的元素

参考资料1:http://www.cnblogs.com/tjudzj/p/4459443.html
参考资料2:https://blog.csdn.net/u011277123/article/details/80110405
参考资料3:https://www.cnblogs.com/lxqiaoyixuan/p/7156944.html
参考资料4:https://blog.csdn.net/huaairen/article/details/86687514

posted @ 2019-05-23 11:17  绛珠仙草林黛玉  阅读(276)  评论(0编辑  收藏  举报