zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    30分钟掌握ES6/ES2015的核心内容(上)
    rem 响应式用法
    angular框架MVVM
    vue3 + vite + elmentui
    vue3 + vite + elmentui
    vue3 + vite 开发新项目
    滚动条滚动加一个进度条
    jquery 截取页面 url ,切换新的url 跳转
    h5,css3
    前端模板预编译技术
  • 原文地址:https://www.cnblogs.com/lindaiyu/p/10910797.html
Copyright © 2011-2022 走看看