详解JAVA中ListIterator和Iterator的辨析

目录
  • 一.相同点
  • 二.不同点
  • 三:Iterator和ListIterator用法示例
  • 总结

在使用java集合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢?下面我们详细分析。这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示:

这里假设集合List由四个元素List1、List2、List3和List4组成,当使用语句Iterator it = List.Iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后移到上图Iterator2所指向的位置。

首先看一下Iterator和ListIterator迭代器的方法有哪些。

Iterator迭代器包含的方法有:

  • hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回false
  • next():返回集合中Iterator指向位置后面的元素
  • remove():删除集合中Iterator指向位置后面的元素

ListIterator迭代器包含的方法有:

  • add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
  • hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
  • hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
  • next():返回列表中ListIterator指向位置后面的元素
  • nextIndex():返回列表中ListIterator所需位置后面元素的索引
  • previous():返回列表中ListIterator指向位置前面的元素
  • previousIndex():返回列表中ListIterator所需位置前面元素的索引
  • remove():从列表中删除next()或previous()返回的最后一个元素(有点拗口,意思就是对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除ListIterator指向位置前面的元素)
  • set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e

一.相同点

都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

二.不同点

1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

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

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

5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

三:Iterator和ListIterator用法示例

ListIterator用法:

package com.collection;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
/**
 * @author 朱伟
 * 链表中ListIterator测试
 *
 */
public class ListIteratorTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> staff = new LinkedList<>();
		staff.add("zhuwei");
		staff.add("xuezhangbin");
		staff.add("taozhiwei");
		ListIterator<String> iter = staff.listIterator();
		String first = iter.next();
		//删除zhuwei
		iter.remove();
		//把zhuwei改为simei
		//iter.set("simei");
		System.out.println("first:"+first);
		iter.add("xiaobai");
		//遍历List元素
		System.out.println("遍历List中元素,方法一:");
		for(String str : staff)
			System.out.println(str+"   ");
		iter = staff.listIterator();
		System.out.println("遍历List中元素,方法二:");
		while(iter.hasNext())
		{
			System.out.println(iter.next());
		}
	}
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • java使用listIterator逆序arraylist示例分享

    思路分析:要逆序遍历某个列表,首先要获得一个ListIterator对象,利用for()循环,以ListIterator类的hasNext()方法作为判断条件,通过循环执行ListIterator类的next()方法将游标定位到列表结尾,然后在另一个for循环中,以ListIterator类的hasPrevious()方法作为判断条件,通过ListIterator类的previous()方法逆序输出列表中的元素. 代码如下: 复制代码 代码如下: import java.util.ArrayLi

  • JAVA中ListIterator和Iterator详解与辨析(推荐)

    在使用Java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.ArrayList.LinkedList和Vector的时候可以使用.这两种迭代器有什么区别呢?下面我们详细分析.这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置. 首先看一下Iterator和ListIterator迭代器的方法有哪些. Iterator迭代器包含的方法有: hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回fal

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

    1.Iterator Iterator的定义如下: public interface Iterator<E> {} Iterator是一个接口,它是集合的迭代器.集合可以通过Iterator去遍历集合中的元素.Iterator提供的API接口如下: forEachRemaining(Consumer<? super E> action):为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常 hasNext():如果迭代器中还有元素,则返回true. next

  • java Iterator接口和LIstIterator接口分析

    java  Iterator接口和LIstIterator接口分析 目录 1.Iterator接口 2.ListIterator 3.Iterator和ListIterator的区别 正文 在继续看ArrayList源码之前,先了解Iterator接口和ListIterator接口,下篇文章详细讲解ArrayList是如何实现它们的. 我们知道,接口只是一种规范,当继承接口并实现其中的方法时,要遵循接口对方法的说明. 1.Iterator接口 Iterator接口取代了Java集合框架中的Enu

  • Java中Iterator与ListIterator迭代的区别

    迭代的时候可以修改数据吗? 答,Iterator迭代的时候可以移除数据,但是不能添加;而ListIterator迭代时可以添加数据,移除数据,倒序遍历; public class Bianli { public static void main(String[] args) { ArrayList<String> list= new ArrayList<>(); list.add("aaa"); list.add("sss"); list.a

  • java中Iterator和ListIterator实例详解

    Iterator和ListIterator的作用范围以及关系: (1) Iterator可以用于迭接口List的实现ArrayList,LinkedList以及Map等. (2) ListIterator顾名思义,就是用于迭代List实现ArrayList,LinkedList. (3) 从源码或API文档中可以看出,Iterator为ListIterator的父类. public interface ListIterator<E> extends Iterator<E> { //

  • 详解JAVA中ListIterator和Iterator的辨析

    目录 一.相同点 二.不同点 三:Iterator和ListIterator用法示例 总结 在使用java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.ArrayList.LinkedList和Vector的时候可以使用.这两种迭代器有什么区别呢?下面我们详细分析.这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示: 这里假设集合List由四个元素List1.List2.List3和List4组成,当使用语句

  • 详解Java中Iterable与Iterator用法

    在Java中,我们可以对List集合进行如下几种方式的遍历: List<Integer> list = new ArrayList<>(); list.add(5); list.add(23); list.add(42); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ","); } Iterator it = list.iterator(); while (i

  • 详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • 详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法.如果只做简单遍历读取,增强for循环确实减轻不少的代码量. 集合概念: 1.作用:用于存放对象 2.相当于一个容器,里面包含着一组对象,其中的每个对象作为集合的一个元素出现 3.jav

  • 详解Java中AbstractMap抽象类

    jdk1.8.0_144 下载地址:http://www.jb51.net/softs/551512.html AbstractMap抽象类实现了一些简单且通用的方法,本身并不难.但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范. 抽象类通常作为一种骨架实现,为各自子类实现公共的方法.上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究. Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实

  • 详解Java中两种分页遍历的使用姿势

    在日常开发中,分页遍历迭代的场景可以说非常普遍了,比如扫表,每次捞100条数据,然后遍历这100条数据,依次执行某个业务逻辑:这100条执行完毕之后,再加载下一百条数据,直到扫描完毕 那么要实现上面这种分页迭代遍历的场景,我们可以怎么做呢 本文将介绍两种使用姿势 常规的使用方法 借助Iterator的使用姿势 1. 数据查询模拟 首先mock一个分页获取数据的逻辑,直接随机生成数据,并且控制最多返回三页 public static int cnt = 0; private static List

  • 详解Java中List的正确的删除方法

    目录 简介 实例 正确方法 法1:for的下标倒序遍历 法2: list.stream().filter().collect() 法3: iterator迭代器 错误方法 法1:for(xxx : yyy)遍历 法2:for的下标正序遍历 原因分析 简介 本文介绍Java的List的正确的删除方法. 实例 需求:有如下初始数据,将list中的所有数据为"b"的元素删除掉.即:填充removeB()方法 package com.example.a; import java.util.Ar

  • 详解Java中@Override的作用

    详解Java中@Override的作用 @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读: 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法. 举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性. @Overr

  • 详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口的LayerInitTask类,ThreadException类,线程安全的Vector 3.思路: 向LayerInitTask中传入Vector,记录异常情况,外部遍历,判断,抛出异常. 4.代码: package step5.exception; import java.util.Vector

随机推荐