Java中的Enumeration、Iterable和Iterator接口详解
前言
在看各类Java书籍或者博文的时候,总是会遇到Enumeration、Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把这三个接口总结一下,一扫之前的各种迷惑。
Enumeration
Enumeration(枚举)接口的作用和Iterator类似,但只提供了遍历Vector和HashTable类型集合元素的功能,不支持元素的移除操作。
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接口的内部类,通过返回不同的迭代器实现不同的迭代方式。
下面通过一个简单的例子来说明Iterable和Iterator,看懂了下面的代码,也就看明白了Iterable和Iterator。
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接口详解的更多相关文章
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- Java集合【2】--iterator接口详解
目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...
- java中Dateformat类的详细使用(详解)
DateFormat其本身是一个抽象类,SimpleDateFormat 类是DateFormat类的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat ...
- Java中的String,StringBuffer,StringBuilder详解与区别
1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...
- java中String是对象还是类?详解java中的String
有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...
- C++/Java中继承关系引发的调用关系详解
C++: 这里引用到了 http://blog.csdn.net/haoel/article/details/1948051/ 中的内容,还请提前阅读陈大神的这篇博客后在阅读本篇. 覆盖,实现多态的基 ...
- Java中的双重检查(Double-Check)详解
在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...
- 线程:Java中wait、notify、notifyAll使用详解
基础知识 首先我们需要知道,这几个都是Object对象的方法.换言之,Java中所有的对象都有这些方法. public final native void notify(); public final ...
- Java中的宏变量,宏替换详解。
群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 首先来看下面这段程序,和群友分享的大致一样. public static void main(String[] args) { String ...
随机推荐
- 快速搭建多线程Windows服务解决方案
一.引言 在软件开发过程中windows服务有的时候非常有用,用于同步数据,发送邮件,宿主WF引擎服务等,但是快速搭建一个好用多线程进行多任务处理的程序往往是一个项目必须考虑的问题.自己在项目中也经常 ...
- How to create my own self signed certificate chain?
--Refer to https://superuser.com/questions/126121/how-to-create-my-own-certificate-chain for detail. ...
- 关于CEdit控件的透明(重绘)
摘自:http://www.jcwcn.com/html/VC/10_19_51_12.htm 做一个透明的Edit控件的主要问题是字符的输出,在Edit里输出的刷新有几个时机,一个是在接收到键盘或鼠 ...
- Oracle高级查询、事物、过程及函数
一.SQL函数 1.分类:单行函数(日期.数值.转换.字符等),多行函数,也称为分组函数(max.min.avg.sum.row_number.rank等). 2.数值函数 abs(n):求数字n的绝 ...
- 因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间
导致你的问题的,应该有2种可能性: 1.存放你的primary文件组的磁盘,已经满了: use master--你的数据库名称 go --看看你的primary组里的文件 select ds.name ...
- 百度AI开放平台,语音识别,语音合成以及短文本相似度
百度AI开放平台:https://ai.baidu.com/ 语音合成 from aip import AipSpeech APP_ID=" #'你的 App ID' API_KEY=&qu ...
- js&jq遇到的问题(不断更新中)
1.普通事件和事件绑定: 代码: 普通事件: var btn=document.getElementById('btn'); btn.onclick=function(){ alert("c ...
- Spring之ApplicationContext
(1)ApplicationContext接口容器 ApplicationContext用于加载Spring的配置文件,在程序中充当“容器”的角色.其实现类有两个.通过Ctrl +T查看: A.配置文 ...
- CodeSmith使用SQLite Provider找不到请求的 .Net Framework 数据提供程序
关于CodeSmith5使用SQLite Provider时的报错:System.BadImageFormatException: 未能加载文件或程序集“System.Data.SQLite,.... ...
- 【原创】Metro大都会扫码乘地铁技术大揭密
本文观点仅为技术猜解,不代表官方线上真实方案. 风靡上海的扫码乘地铁,从2018年1月20日全面支持,至今近10天了.起初不以为然,过了大概1个礼拜左右,也下载了Metro大都会APP,开始体验扫 ...