Java ListIterator 迭代器的使用(Iterator 与 ListIterator 的区别)

简介: Java ListIterator 迭代器的使用(Iterator 与 ListIterator 的区别)

一、简介

  • 通过 List 集合的 listIterator() 方法得到,它是 List 集合特有的迭代器。
  • 允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。
  • IteratorListIterator 的区别:
    Iterator:只能从上到下便利元素。
    ListIterator:可以沿任一方向遍历列表,修改列表、获取当前索引。

二、案例代码

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Iterator;
public class test {
  public static void main(String[] args) {
    // 创建集合对象
    List<String> list = new ArrayList<String>();
    // 添加
    list.add("dzm");
    list.add("xyq");
    System.out.println(list); // [dzm, xyq]
    // -------------------- Iterator 迭代器
    // Iterator 迭代器
    Iterator<String> it = list.iterator();
    // 便利,从上到下便利
    while (it.hasNext()) {
      System.out.println(it.next()); // dzm xyq
    }
    // 循环中途插入数据,会报错
    for (String string : list) {
      if (string.equals("dzm")) {
        list.add("dll"); // Exception in thread "main" java.util.ConcurrentModificationException
      }
    }
    // -------------------- ListIterator 迭代器
    // ListIterator 迭代器
    // ListIterator<String> lit = list.listIterator(list.size()); // 将位置移到最尾部,方面从下到上便利
    ListIterator<String> lit = list.listIterator(); // 默认从 0 开始
    // 便利,从上到下便利
    while (lit.hasNext()) {
      System.out.println(lit.next()); // dzm xyq
    }
    // 便利,从下往上便利
    while (lit.hasPrevious()) {
      System.out.println(lit.previous()); // xyq dzm
    }
    // 便利,从上往下便利,循环中途插入数据,没问题
    while (lit.hasNext()) {
      String s = lit.next();
      if (s.equals("dzm")) {
        // Iterator 无法做到进行添加操作,通过变量 list 也不行,因为在调用 next() 的时候,会比较实际修改集合的次数与预期修改集合的次数效验,会不一致。
        // ListIterator 会在调用 next() 的时候,同步实际与预期修改次数,保持一致,所以可以进行添加
        lit.add("djy");
      }
    }
    System.out.println(list); // [dzm, djy, xyq]
  }
}
相关文章
|
1月前
|
Java 编译器 API
如何在 Java 中避免使用迭代器
在Java中,为了避免使用迭代器,可以采用foreach循环来遍历集合或数组,简化代码,提高可读性。此外,Java 8引入的Stream API提供了更强大的功能,如filter、map等方法,能够以函数式编程风格处理数据,进一步减少对传统迭代器的依赖。
42 6
|
24天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
63 14
|
20天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
20 1
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
46 8
|
1月前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
2月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
2月前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
100 0
|
Java 容器 API
JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识太多了,我们只能慢慢的来分析了 一.
1081 0
|
1天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
11 3