您的位置:首页 > 编程语言 > Java开发

Java中的Enumeration、Iterable和Iterator接口详解

2019-07-21 23:51 2001 查看

前言

在看各类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日 于内蒙古呼和浩特。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: