详解Java中的迭代迭代器Iterator与枚举器Enumeration
作者:kuiwu-wang 发布时间:2021-08-21 19:32:44
迭代器Iterator接口
1.迭代器接口
Iterable
内置方法iterator(), 返回一个新建的 Iterator。
如:
public interface Iterable { Iterator Iterator(); }
Iterator 有 hasNext() 和 next() 两个方法要实现。 public interface Iterator { boolean hasNext(); Item next(); void remove(); //可选实现 }
2.实现
导入
import java.util.Iterator;
泛型的类, 实现Iterable接口 implements Iterable< Item >
实现Iterable的iterator()方法, 返回任意定义迭代器类型。
定义迭代器类型 implements Iterator< Item >
实现 hasNext()、 next()、 remove()
3.示例:
public class Stack<Item> implements Iterable<Item> {
public Iterator<Item> iterator() {
return new ListIterator<Item>(first);
}
private class ListIterator<Item> implements Iterator<Item> {
private Node<Item> current;
public ListIterator(Node<Item> first) {
current = first;
}
public boolean hasNext() { return current != null; }
public void remove() { throw new UnsupportedOperationException(); }
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
}
}
4.调用方法
foreach 迭代
for (String s : stack) System.out.println(s);
如果是 int\double 等基本类型, 请使用之前的转换关系
5.循环遍历
Iterator i = stack.iterator(); while (i.hasNext()) { String s = i.next(); }
枚举器Enumeration接口
Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法,与Iterator差不多,用来遍历集合中的元素 但是枚举Enumeration只提供了遍历Vector和Hashtable类型集合元素的功能,这种类型的集合对象通过调用elements()方法获取一个Enumeration对象 然后Enumeratino对象再调用以下方法来对集合中的元素进行遍历。
hasMoreElements():判断Enumeration对象中是否还有数据
nextElement():获取Enumeration对象中的下一个数据
实例如下:
Enumeration req = request.getParameterNames();
while (req.hasMoreElements()) {
Object obj = (Object) req.nextElement();
if (obj.toString().trim().equals("LastPage")) {
System.out.println("LastPage \n");
} else if (obj.toString().trim().equals("NextPage")) {
System.out.println("NextPage");
}
}
Iterator和Enumeration区别
在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。今天,我们就一起学习一下它们之间到底有什么区别。
我们先看看 Enumeration.java 和 Iterator.java的源码,再说它们的区别。
Enumeration是一个接口,它的源码如下:
package java.util;
public interface Enumeration<E> {
boolean hasMoreElements();
E nextElement();
}
Iterator也是一个接口,它的源码如下:
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
看完代码了,我们再来说说它们之间的区别。
(01) 函数接口不同
Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。
(02) Iterator支持fail-fast机制,而Enumeration不支持。
Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。
而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。


猜你喜欢
- 在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称
- 静态方法和非静态方法的区别:1.静态方法不需要类实例化就可以调用,反之非静态方法需要实例化后才能调用;2.静态方法只能访问静态成员和方法,非
- 前言在前面弹跳小球的基础上实现一个简单的飞机游戏,主要包括飞机的显示、控制移动、显示复杂图案、发射激光、打靶练习等功能。目前的飞机还很简单,
- 在java项目开发过程中,使用properties文件作为配置基本上是必不可少的,很多如系统配置信息,文件上传配置信息等等都是以这种方式进行
- 什么是 Retrofit ?Retrofit是Square开发的一个Android和Java的REST客户端库。这个库非常简单并且具有很多特
- 在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 co
- 基本环境:Android studio3.6NDK:r15c(尽量使用该版本)Opencv3.4.1 android sdk操作:(1)新建
- 事务介绍一个事务要么同时成功,要么同时失败特性Atomic原子性 事务是由一个或多个活动组成的一个工作单元。原子性确保事务中的所有操作全部发
- 一、RESTful 简介REST 是一种软件架构风格。REST:Representational State Transfer,表现层资源状
- sum(参数) 列名作为参数项目中有很多个字段,当字段为空的时候,求该列的平均值并赋值给该字段。如: id
- Android 6.0起,Android加强了权限管理,引入运行时权限概念。对于:1. Android 5.1(API 22)及以前版本,应
- 说到下拉刷新控件,网上版本有很多,很多软件也都有下拉刷新功能。有一个叫XListView的,我看别人用过,没看过是咋实现的,看这名字估计是继
- 1. Easy Rules 概述Easy Rules是一个Java规则引擎,灵感来自一篇名为《Should I use a Rules En
- 项目中需要实现一个状态显示的悬浮框,要求可以设置两种模式:拖动模式和不可拖动模式。实现效果图如下:实现步骤:1.首先要设置该悬浮框的基本属性
- 目录 Dubbo是什么?Dubbo能做什么?介绍Api模块实现producer模块实现consumer模块实现 Dubb
- 以String转Date为例:定义转换器:import java.text.ParseException;import java.util.
- 一. spring配置文件:application.xml<?xml version="1.0" encoding
- public static class DataTableHelper { &nb
- 前言本次示例代码的文件结构如下图所示。1. 导入依赖坐标在 order-service 的 pom.xml 文件中导入 Feign 的依赖坐
- 组件在容器(比如Jframe)中的位置和大小是由布局管理器来决定的。所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理。种类j