详解Java中的迭代迭代器Iterator与枚举器Enumeration
迭代器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事件。