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]
  }
}
相关文章
|
7月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
1222 1
|
8月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
3110 102
|
9月前
|
存储 缓存 人工智能
Java int和Integer的区别
本文介绍了Java中int与Integer的区别及==与equals的比较机制。Integer是int的包装类,支持null值。使用==比较时,int直接比较数值,而Integer比较对象地址;在-128至127范围内的Integer值可缓存,超出该范围或使用new创建时则返回不同对象。equals方法则始终比较实际数值。
304 0
|
9月前
|
安全 算法 Java
Java 中 synchronized 与 AtomicInteger 的区别
在Java多线程编程中,`synchronized`和`AtomicInteger`均用于实现线程安全,但原理与适用场景不同。`synchronized`是基于对象锁的同步机制,适用于复杂逻辑和多变量同步,如银行转账;而`AtomicInteger`采用CAS算法,适合单一变量的原子操作,例如计数器更新。二者各有优劣,应根据具体需求选择使用。
251 0
|
10月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
821 0
|
10月前
|
存储 Java C语言
Java List 复制:浅拷贝与深拷贝方法及区别
我是小假 期待与你的下一次相遇 ~
1017 1
|
11月前
|
Java
Java 中 Exception 和 Error 的区别
在 Java 中,`Exception` 和 `Error` 都是 `Throwable` 的子类,用于表示程序运行时的异常情况。`Exception` 表示可被捕获和处理的异常,分为受检异常(Checked)和非受检异常(Unchecked),通常用于程序级别的错误处理。而 `Error` 表示严重的系统级问题,如内存不足或 JVM 错误,一般不建议捕获和处理。编写程序时应重点关注 `Exception` 的处理,确保程序稳定性。
322 0
|
Java 容器 API
JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识太多了,我们只能慢慢的来分析了 一.
1188 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
305 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
319 1