ListIterator接口详解

java 专栏收录该内容
7 篇文章 0 订阅

最近在看List文档时,看到了一个ListIterator接口,比Iterator接口多了几个字母,想盘盘它。

文中关于接口与方法的说明,皆为参照JDk官方文档,挑重点翻译成大白话,辅以代码理解。

有要深入了解此接口的童鞋,欢迎围观并提出见解和意见,后续会更新各个接口与类的详解。

JDK版本:1.8


    1. 接口说明

       首先,从该接口的定义我们可以知道,接口可以继承接口

    官方文档说,此接口只是用于List的迭代器,通过它我们可以从任意方向遍历列表、在迭代期间修改列表、获取迭代器在列表中的当前位置。ListIterator没有当前元素(current element),它的光标总是处于调用previous()方法返回的元素和next()方法返回的元素之间。长度为n的列表,它的迭代器有n+1个光标位置,如下图:

                             

                                                                                          图一

绿色代表ListIterator迭代器的位置,在ListItarator中迭代器的位置都是指的光标的位置。红色代表List列表中的元素,把这张图存脑袋里,把这张图存脑袋里,把这张图存脑袋里,这个接口的所有操作都没啥障碍了。

   2. 生成迭代器

        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        ListIterator<String> it = list.listIterator();                //无参
        ListIterator<String> it1 = list.listIterator(list.size());    //有参

    3. 方法详解:

        3.1  E next ( )        返回当前光标位置的下一个元素

    在使用无参方法生成迭代器时,迭代器的位置如图一,调用next()方法时,返回元素a,光标向后移动,代码实现如下:  

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        nextMethod(list);       //输出为a
    }
    private static void nextMethod(List list){
        ListIterator<String> it = list.listIterator();
        String s1 = it.next();
        System.out.println(s1);
    }

  调用完一次next()方法并且不出现异常时,迭代器位置向后挪一个单位,联系两次调用next()方法时,奇迹出现了:

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        nextMethod(list);       //输出为a,b
    }
    private static void nextMethod(List list){
        ListIterator<String> it = list.listIterator();
        String s1 = it.next();
        String s2 = it.next();
        System.out.println(s1);
        System.out.println(s2);
    }

注意,当迭代器位置处于列表最后一个元素的右面的时候,调用next()方法会出现异常,因为光标后面已经没有元素了呀

为避免异常发生,就要用到下一个方法:

        3.2  boolean  hasNext ( )        当前光标位置的右面如果有元素,则返回true;没有元素,则返回false。

        遍历List:

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        hasNextMethod(list);            //输出a,b,c,d
    }
    private static void hasNextMethod(List list){
        ListIterator<String> it = list.listIterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }

        3.3    E  previous ( )  和  boolean  hasPrevious ( )    关于方法详解参照上面两个,换个方向就可以了。

            反向遍历数组时,调用有参方法生成迭代器,参数为list.size();      

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        hasPreviousMethod(list);        //输出d,c,b,a
    }
    private static void hasPreviousMethod(List list){
        ListIterator<String> it = list.listIterator(list.size());
        while (it.hasPrevious()){
            System.out.println(it.previous());
        }
    }

        3.4  void  add ( E  e )      将指定元素插入到previous()返回的元素与当前光标位置之间。如何理解呢?上图:

            

               就是说不仅将元素插入到e1和e2之间,也插入到了e1和cursor之间。

                

             此时调用next()方法,仍然返回的是e2,调用previous()返回的就是新插入的元素了。

             值得注意的是,当光标位置处于0(第一个元素左边)时,调用add(E)方法会出现异常,因为现在光标左边还没有元素呀

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        addMethod(list);        //输出a,e,b,c,d
    }
    private static void addMethod(List list){
        ListIterator<String> it = list.listIterator();
        it.next();
        it.add("e");        //调用add(E)方法时,要确定光标前面有元素
        System.out.println(list);
    }

        3.5   void  remove ( )           从列表中删除最后一次执行next()或previous()方法返回的元素。

            三点:1.调用remove()方法之前,一定要有next()或previous()方法执行,否则报错:java.lang.IllegalStateException

                       2.执行next() 或 previous()之后与执行remove()之前,不能执行add(E)方法,否则报错:                                                                         java.lang.IllegalStateException

                       3.就近原则。

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        removeMethod(list);            //输出b,c,d
    }
    private static void removeMethod(List list){
        ListIterator<String> it = list.listIterator();
        it.next();
        it.remove();
        System.out.println(list);
    }

        3.6  void  set ( E  e )           用参数元素代替next() 或 previous()返回的最后一个元素。并且在调用set(E)方法前,不能调用                                                       remove() 和 add(E) 方法,否则会报错:java.lang.IllegalStateException。

                                                  因为调用remove()或add(E)方法之后,指针并没有指向哪个元素,只是处于了一个位置。

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        setMethod(list);            //输出e,b,c,d
    }
    private static void setMethod(List list){
        ListIterator<String> it = list.listIterator();
          it.next();
          it.set("e");
        System.out.println(list);
    }

              主要就上面这些,整理了一遍感觉思路也清晰了。平时几乎用不上这个接口,不过下班闲着也是闲着,学学技术也挺好的哈!!!

 

 

  • 2
    点赞
  • 2
    评论
  • 12
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值