Iterator迭代器-ListIterator-Enumeration枚举类接口的特点和区别



1、Iterator的特点:

API中是这样解释的:

对collection进行迭代的迭代器。它取代了Enumeration.迭代器与枚举有两点不同:

A.迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素。

B.在方法名上得到了改进。

常用的方法有:

hasNext()如果仍有元素可以迭代,则返回true.

next()返回迭代的下一个元素。

remove()删除一个元素。

判断如果当前元素为abcd2,那么直接将它从列表中删除。

实例代码如下:说明在Iterator迭代过程中,对Iterator对象的操作,对list集合有影响。

迭代器(Iterator)

      迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

      Java中的Iterator功能比较简单,并且只能单向移动:

          (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

          (2) 使用next()获得序列中的下一个元素。

          (3) 使用hasNext()检查序列中是否还有元素。

          (4) 使用remove()将迭代器新返回的元素删除。

      Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

迭代器应用:

list l = new ArrayList();

l.add("aa");

l.add("bb");

l.add("cc");

for (Iterator iter = l.iterator(); iter.hasNext();) {

String str = (String)iter.next();

System.out.println(str);

}

/*迭代器用于while循环

Iterator iter = l.iterator();

while(iter.hasNext()){

String str = (String) iter.next();

System.out.println(str);

}

*/

2、ListIterator的特点:

在API中是这样描述的,它的父类接口是Iterator,名称是系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator没有当前元素,它的光标位置始终位于调用previous()所返回的元素和调用next()所返回的元素之间。长度为n的列表的迭代器有n+1个可能的指针位置。

常用方法:

add(E e)将指定元素插入到某个元素的后面。

判断在abcd2后面插入元素abcd9,根据最后的list集合的结果就可以知道。

remove()效果跟Iterator一样。

hasNext()效果跟Iterator一样。

next()效果跟Iterator一样。

set(E e)修改成指定元素。

判断如果当前元素为abcd2,那么直接将abcd2修改成abcd9。

hasPrevious()反向判断是否还有前一元素。如果有返回true

previous()返回列表中的前一个元素。

特别注意,这个方法是建立在当前光标的前一个元素存在。否则将没有返回值。像下面如果把前一个while(it.hasNext)循环去掉,那么后一个while(it.hasPrevious())没有返回值,因为it的光标还在0角标位置。

previousIndex()返回对previous的后续调用所返回元素的索引。

nextIndex()返回对next的后续调用所返回元素的索引。

注意分析下面源代码:

package p3;

import java.util.ArrayList;

import java.util.List;

import java.util.ListIterator;

public class ListIteratorDemo {

public static void main(String[] args) {

List list = new ArrayList();

list.add("abcd1");

list.add("abcd2");

list.add("abcd3");

ListIterator it = list.listIterator();

while(it.hasNext()){System.out.println(it.next());}

System.out.println("********逆向遍历********");

while(it.hasPrevious()){

Object obj = it.previous();

System.out.println(obj);

if(obj.equals("abcd2")){

System.out.println("++++++++++++++");

System.out.println(it.previous());

System.out.println(it.nextIndex());

System.out.println(it.previousIndex());

System.out.println(it.next());

System.out.println("++++++++++++++");

}

}

}

}

运行效果:

解释1:为什么输出abcd1?

当前位置为abcd2,因为它调用previous()方法,所以返回当前位置之前的一个元素,那么就是abdc1,同时当前光标指定0。

解释2:为什么输出0?

由于当前光标指定为0,而nextIndex方法正是输出当前光标所在的角标值。并且调用这个方法,不会移动光标,所以当前光标还是0。

解释3:为什么输出-1?

由于当前光标是0,所以如果再调用previous()方法,返回值为-1,即不存在此位置,同时当前光标还是0。

解释4:为什么输出abcd1?

因为当前光标是在0,而next()方法正是输出当期光标所对应的元素值,所以是abcd1,同时光标向下移动,变成1,经过调用此方法后,当前光标为1。同时整个if()代码块执行结束。

解释5:为什么输出abcd1?

由于上面的if()代码块已经执行完毕,并且光标所在位置是1,而while循环的判断条件为it.hasPrevious(),当前光标之前是否还有元素,明显还有一个abcd1。所以就直接输出abcd1。并且当前光标变为0。

总结:只有调用next(),previous()两个方法时,光标才移动。

3、Enumeration的特点:

API中是这样描述的,它主要是何Vector结合配套使用。另外此接口的功能与Iterator接口的功能是重复的,此外,Iterator接口添加了一个可选的移除操作,并且使用较短的方法名。新的实现应该优先考虑使用Iterator接口而不是Enumeration接口。

常用方法:

hasMoreElements()判断集合中是否还有下一个元素。功能类似与Iterator接口当中的hasNext()。

nextElement()返回下一个元素。功能类似与Iterator接口当中的next()。

时间: 2024-11-01 15:25:37

Iterator迭代器-ListIterator-Enumeration枚举类接口的特点和区别的相关文章

Java枚举类接口实战

枚举类可以实现一个或多个接口.与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法. 如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑. public interface IGradeHandler { String getGrade(String studentName); } public enum GradeHandlerEnum implements IGradeHandler { //five grade l

集合输出接口-Iterator迭代输出-古老枚举输出:Enumeration

1.Iterator迭代输出(95%) Iterator是集合输出的主要接口,那么此接口定义如下: public interface Iterator<E> { public boolean hasNext() ; // 判断是否还有下一个数据 public E next() ; // 取得当前数据 } 实现代码: 1 package cn.demo; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import j

Java的Iterator迭代器补充,增强for循环,泛型,List接口,set接口

1.Iterator迭代器:(1)类型转换异常:ClassCastException:集合中存放的是多个对象时,在强转时会出现: package com.oracle.demo01; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class demo01 { public static void main(String[] args) { method03();

揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)

枚举给用户定义固定数据组提供了方便.枚举类就是一系列常量整型值,这也就意味着枚举类型不能被修改. 这里我们将要讨论C语言中枚举类型的用法和限制. 枚举通过枚举关键值定义,类似结构体定义 语法(Syntax): enum tagname{CONST1=1,CONST2,-} enumVariable; tagname,枚举类型名,这一项可以省略. {CONST1=1,CONST2,-}一组代替常量值的字符串,每个字符串对应一个整型数据,整形数据从0开始,第二个是1,等等.除非使用者自己定义类如CO

集合 Iterator 迭代器 API 案例

接口 Iterable<E> public interface java.lang.Iterable<T> 1 1 1 public interface java.lang.Iterable<T> 所有已知子接口:BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Collection<E>, Deque<E>, List<E&g

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1)Iterator定义有三个方法: ①boolean hasNext()方法:判断指针后面是否有元素. ②E next()方法:指针后移,并返回当前元素.E代表泛型,默认为Object类型. ③void remove()方法:在原集合中删除刚刚返回的元素. 2)对于List集合而言,可以通过基于下标的

Java学习之Iterator(迭代器)的一般用法和详解

迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因为创建它的代价小. Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元素.注意:iterator()方法是java.lang.Iterable接口,被Collection继承

Iterator - 迭代器模式

定义 提供一个方法顺序访问一个聚合对象中个各个元素,而又不需要暴露该对象的内部结构. 案例 一个聚合对象,如一个列表List,应该提供一种方法来让别人可以访问它的元素,而又不用暴露内部结构.迭代器模式可以很好的解决这类问题,关键思想就是将队列表的访问和遍历从列表对象中分离出来,放到一个迭代器Iterator对象中,Iterator定义了一个访问List对象的接口. AbstractList提供了List的基本接口: template<class Item> class AbstractList