详解Java中的迭代迭代器Iterator与枚举器Enumeration
迭代器Iterator接口
1.迭代器接口
Iterable
内置方法iterator(),返回一个新建的Iterator。
如:
publicinterfaceIterable{IteratorIterator();}
Iterator有hasNext()和next()两个方法要实现。publicinterfaceIterator{booleanhasNext();Itemnext();voidremove();//可选实现}
2.实现
导入
importjava.util.Iterator;
泛型的类,实现Iterable接口implementsIterable<Item>
实现Iterable的iterator()方法,返回任意定义迭代器类型。
定义迭代器类型implementsIterator<Item>
实现hasNext()、next()、remove()
3.示例:
publicclassStack<Item>implementsIterable<Item>{ publicIterator<Item>iterator(){ returnnewListIterator<Item>(first); } privateclassListIterator<Item>implementsIterator<Item>{ privateNode<Item>current; publicListIterator(Node<Item>first){ current=first; } publicbooleanhasNext(){returncurrent!=null;} publicvoidremove(){thrownewUnsupportedOperationException();} publicItemnext(){ if(!hasNext())thrownewNoSuchElementException(); Itemitem=current.item; current=current.next; returnitem; } } }
4.调用方法
foreach迭代
for(Strings:stack)System.out.println(s);
如果是int\double等基本类型,请使用之前的转换关系
5.循环遍历
Iteratori=stack.iterator();while(i.hasNext()){Strings=i.next();}
枚举器Enumeration接口
Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法,与Iterator差不多,用来遍历集合中的元素 但是枚举Enumeration只提供了遍历Vector和Hashtable类型集合元素的功能,这种类型的集合对象通过调用elements()方法获取一个Enumeration对象 然后Enumeratino对象再调用以下方法来对集合中的元素进行遍历。
hasMoreElements():判断Enumeration对象中是否还有数据
nextElement():获取Enumeration对象中的下一个数据
实例如下:
Enumerationreq=request.getParameterNames(); while(req.hasMoreElements()){ Objectobj=(Object)req.nextElement(); if(obj.toString().trim().equals("LastPage")){ System.out.println("LastPage\n"); }elseif(obj.toString().trim().equals("NextPage")){ System.out.println("NextPage"); } }
Iterator和Enumeration区别
在Java集合中,我们通常都通过“Iterator(迭代器)”或“Enumeration(枚举类)”去遍历集合。今天,我们就一起学习一下它们之间到底有什么区别。
我们先看看Enumeration.java和Iterator.java的源码,再说它们的区别。
Enumeration是一个接口,它的源码如下:
packagejava.util; publicinterfaceEnumeration<E>{ booleanhasMoreElements(); EnextElement(); }
Iterator也是一个接口,它的源码如下:
packagejava.util; publicinterfaceIterator<E>{ booleanhasNext(); Enext(); voidremove(); }
看完代码了,我们再来说说它们之间的区别。
(01)函数接口不同
Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。
(02)Iterator支持fail-fast机制,而Enumeration不支持。
Enumeration是JDK1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。
而Iterator是JDK1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。