前言

在看各类Java书籍或者博文的时候,总是会遇到EnumerationIterableIterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把这三个接口总结一下,一扫之前的各种迷惑。

Enumeration

Enumeration(枚举)接口的作用和Iterator类似,但只提供了遍历VectorHashTable类型集合元素的功能,不支持元素的移除操作。

Enumeration接口声明的方法如下:

方法 描述
boolean hasMoreElements() 还有更多要提取的元素时返回true,在枚举所有元素后返回false
E nextElement() 返回集合中的下一个元素

由于Enumeration接口已由Iterator取代,所有我这里就不做更详细的总结。这里提供一个简单的使用Demo:

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector; public class EnumerationDemo {
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("Lisa");
v.addElement("Billy");
v.addElement("Mr Brown"); Enumeration e = v.elements(); while (e.hasMoreElements()) {
String value = (String)e.nextElement();
System.out.println(value);
} Hashtable h = new Hashtable();
h.put("name", "Yanggd");
h.put("age", "25");
h.put("location", "内蒙古呼和浩特"); e = h.keys(); while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = (String) h.get(key);
System.out.println("KEY =>" + key + "; VALUE=>" + value);
}
}
}

Iterable和Iterator

迭代器是一种模式、可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。

  • Iterable:实现这个接口的集合对象支持迭代,是可以迭代的;实现了这个可以配合foreach使用;
  • Iterator:迭代器,提供迭代机制的对象,具体如何迭代是这个Iterator接口规范的。

Iterable接口有以下三个方法:

方法 描述
Iterator iterator() 返回一个Iterator对象
void forEach(Consumer<? super T> action) 对集合中的每个元素执行action动作
Spliterator spliterator() 返回一个Spliterator对象

Iterator接口有以下三个方法:

方法 描述
boolean hasNext() 每次next之前,先调用此方法探测是否迭代到终点
E next() 返回当前迭代元素,同时,迭代游标后移
void remove() 删除最近一次已近迭代出出去的那个元素;只有当next执行完后,才能调用remove函数

Java容器中,所有的Collection子类会实现Iteratable接口以实现foreach功能,Iteratable接口的实现又依赖于实现了Iterator的内部类(参照LinkedList中listIterator()和descendingIterator()的JDK源码)。有的容器类会有多个实现Iterator接口的内部类,通过返回不同的迭代器实现不同的迭代方式。

下面通过一个简单的例子来说明IterableIterator,看懂了下面的代码,也就看明白了IterableIterator

import java.util.*;

public class IterableDemo implements Iterable<String> {
private String[] words = "I love coding".split(""); // 默认迭代器
public Iterator<String> iterator() {
// 匿名内部类
return new Iterator<String>() {
private int index = 0; @Override
public boolean hasNext() {
return index < words.length;
} @Override
public String next() {
return words[index++];
} @Override
public void remove() {
throw new UnsupportedOperationException();
}
};
} // 反向迭代器
public Iterable<String> reverseIterator() {
return new Iterable<String>() {
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int index = words.length - 1; @Override
public boolean hasNext() {
return index > -1;
} @Override
public String next() {
return words[index--];
} @Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
} public static void main(String[] args) {
IterableDemo iterableDemo = new IterableDemo(); // 默认迭代器
for (String value : iterableDemo) {
System.out.print(value);
} System.out.println(); // 反向迭代器
for (String value : iterableDemo.reverseIterator()) {
System.out.print(value);
}
}
}

总结

又是一个小的知识点,再恶补一下。重温一下这些细节,让自己以后少掉点坑。

2019年7月21日 于内蒙古呼和浩特。

Java中的Enumeration、Iterable和Iterator接口详解的更多相关文章

  1. JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  2. Java集合【2】--iterator接口详解

    目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...

  3. java中Dateformat类的详细使用(详解)

    DateFormat其本身是一个抽象类,SimpleDateFormat 类是DateFormat类的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat ...

  4. Java中的String,StringBuffer,StringBuilder详解与区别

    1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...

  5. java中String是对象还是类?详解java中的String

    有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...

  6. C++/Java中继承关系引发的调用关系详解

    C++: 这里引用到了 http://blog.csdn.net/haoel/article/details/1948051/ 中的内容,还请提前阅读陈大神的这篇博客后在阅读本篇. 覆盖,实现多态的基 ...

  7. Java中的双重检查(Double-Check)详解

    在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...

  8. 线程:Java中wait、notify、notifyAll使用详解

    基础知识 首先我们需要知道,这几个都是Object对象的方法.换言之,Java中所有的对象都有这些方法. public final native void notify(); public final ...

  9. Java中的宏变量,宏替换详解。

    群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 首先来看下面这段程序,和群友分享的大致一样. public static void main(String[] args) { String ...

随机推荐

  1. Hadoop Streaming框架学习(二)

    1.常用Streaming命令介绍 使用下面的命令运行Streaming MapReduce程序: 1: $HADOOP_HOME/bin/hadoop/hadoop streaming args 其 ...

  2. QT 那些事

    一直做的是windows开发,有2个小项目想做到手机.看来看去,选择了QT.本文介绍自己的学习的一些心得,希望对你有帮助.1.选择QT2.安卓的一些事3.QML调用C++4.资源集成(比较有用,网上资 ...

  3. [收录] Highcharts-ng —— AngularJS 的图表扩展

    原文:http://www.tuicool.com/articles/u6VZJjQ Highcharts-ng 是一个 AngularJS 的指令扩展,实现了在AngularJS 应用中集成High ...

  4. Python自动化测试 (八)unittest 单元测试

    任何一种编程语言, 都会有单元测试框架, 本文介绍Python 自带的unittest模块 # -* - coding: UTF- -* - class Myclass: def sum(self,x ...

  5. Hadoop集群(第6期)JDK和SSH无密码配置

    1.Linux配置java环境变量 1.1 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,执行命令 ./jdk-6u14-linux-i586.bi ...

  6. java.lang.ClassNotFoundException: org.jaxen.JaxenException 解决方法

    当遇到如下exception时, May 11, 2017 4:23:17 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE ...

  7. 30212Java_数组

    数组 1.综述 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们. 数组的三个 ...

  8. React躬行记(4)——生命周期

    组件的生命周期(Life Cycle)包含三个阶段:挂载(Mounting).更新(Updating)和卸载(Unmounting),在每个阶段都会有相应的回调方法(也叫钩子)可供选择,从而能更好的控 ...

  9. 浅入深出Vue:数据渲染

    今天来正式开始 vue的学习,首当其冲的当然是数据的渲染.毕竟数据就是拿来看的,看看如果使用 vue来展示数据. 为什么渲染 俗话说 "人靠衣装马靠鞍", 那咱们的代码就是得靠 U ...

  10. CentOS7.5上FTP服务的安装与使用

    1.FTP简介 1.1FTP:File Transfer Protocol 文件传输协议 FTP是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式.它属于网络传输协议的应用层.文件传送(f ...