热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java集合中关于Iterator和ListIterator的用法说明

这篇文章主要介绍了Java集合中关于Iterator和ListIterator的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

1.Iterator

Iterator的定义如下:

public interface Iterator {}

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下:

forEachRemaining(Consumer<&#63; super E> action):为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常

hasNext():如果迭代器中还有元素,则返回true。

next():返回迭代器中的下一个元素

remove():删除迭代器新返回的元素。

例子:

import java.util.*;
public class TestIterator {
 public static void main(String[] args) {
  ArrayList a = new ArrayList();
  a.add("aaa");
  a.add("bbb");
  a.add("ccc");
  System.out.println("Before iterate : " + a);
  Iterator it = a.iterator();
  while (it.hasNext()) {
   String t = it.next();
   if ("bbb".equals(t)) {
    it.remove();
   }
  }
  System.out.println("After iterate : " + a);
 }
}

我们可以看到:首先往一个ArrayList里装了aaa,bbb,ccc,然后进行判断删除bbb,最后ArrayList里只剩 aaa,ccc。

我们来验证一下:

注意:

(1)Iterator只能单向移动。

(2)Iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。

2.ListIterator

ListIterator是一个功能更加强大的, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。

我们先来看一段关于ListIterator的描述:

ListIterator接口定义如下:

Interface ListIterator{}

包含的方法有:

由以上定义我们可以推出ListIterator可以:

(1)双向移动(向前/向后遍历).

(2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.

(3)可以使用set()方法替换它访问过的最后一个元素.

(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素.

使用例子:

import java.util.*;
public class TestListIterator{

 public static void main(String[] args) {
  ArrayList a = new ArrayList();
  a.add("aaa");
  a.add("bbb");
  a.add("ccc");
  System.out.println("Before iterate : " + a);
  ListIterator it = a.listIterator()
  while (it.hasNext()) {
   System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
  }
  while (it.hasPrevious()) {
   System.out.print(it.previous() + " ");
  }
  System.out.println();
  it = a.listIterator(1);//调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
  while (it.hasNext()) {
   String t = it.next();
   System.out.println(t);
   if ("ccc".equals(t)) {
    it.set("nnn");
   } else {
    it.add("kkk");
   }
  }
  System.out.println("After iterate : " + a);
 }
}

解释:

第1行:新建一个ArrayList,命名为a;

第2行、第3行和第4行分别一次往ArrayList里添加了aaa,bbb,ccc;

第5行:输出ArrayList里的值:aaa,bbb,ccc

第6行:调用了a的listIterator方法,并使ListIterator类型的it指向,也就是说ListIterator类型的it指向了ArrayList容器, 通过调用ArrayList的listIterator方法来进行容器内的遍历。

第7行、8、9行,调用it的hasNext()方法进行判断容器中是否还有元素,如果有,则输出元素,当前元素前一个元素的索引,当前元素后一个元素的索引,

所以会输出:

aaa,0,1

bbb,1,2

ccc,2,3

第10行,此时,it已经指向了ArrayList的最后一个元素,在这里调用了ListIterator的hasPrevious()方法,就是,开始往前遍历(上面是往后遍历) 在这个while循环中,会以此输出:ccc bbb aaa。

第13行:输出换行。

第14行:现在it应该已经再一次指向ArrayList的开头。在这一行中,it又被用到了,同样的用到了ArrayList的listIteror方法,这一次不同,而是it指向了listIteror的第二个元素,因为是1,第一个元素的索引是0,也就是说it指向了ArrayList里的bbb。bbb是开头的元素。

第15行:再一次是调用了ListIterator的hasnext()方法,来判断ArrayList里是否还有元素。

第16行:调用了it的next()方法,所谓next方法,是指找到剩下元素的第一个元素,也就是bbb,并把它赋值了String 的 t;

第17行:输出bbb

第18行:19、20,21行,如果bbb与ccc相等则将bbb set成nnn,否则,add()来添加kkk,那么在哪里添加呢,是在next方法返回的元素之前,next方法返回的元素是ccc,也就是在bbb,和ccc之间添加kkk。现在容器中有aaa、bbb、kkk以及ccc。返回到第15行,再次以此往下执行,会进行if判断,然后把ccc设置nnn。

第24行,最后输出ArrayList里的元素:aaa、bbb、kkk、nnn。

我们来验证一下:

Iterator和ListIterator区别

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

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

(1)ListIterator有add()方法,可以向List中添加对象,而Iterator不能

(2)ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

(3)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

(4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。

以上这篇Java 集合中关于Iterator和ListIterator的用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 题库来源:安全生产模拟考试一点通公众号小程序G3锅炉水处理报名考试是安全生产模拟考试一点通生成的,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了W3C标准盒模型和IE传统盒模型的区别,探讨了CSS3中box-sizing属性的使用方法及其在布局中的重要性。通过实例分析,帮助读者更好地理解和应用这一关键概念。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细探讨了Java中StringBuffer类在不同情况下的扩容规则,包括空参构造、带初始字符串和指定初始容量的构造方法。通过实例代码和理论分析,帮助读者更好地理解StringBuffer的内部工作原理。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文探讨了在Linux系统上使用Docker时,通过volume将主机上的HTML5文件挂载到容器内部指定目录时遇到的403错误,并提供了解决方案和详细的操作步骤。 ... [详细]
author-avatar
赖雨蓉744_128
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有