java基础之迭代器和枚举器初解

迭代器 为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator)。
Iterable接口 Iterable是JDK1.5之后添加的新接口,也是Collection的父接口.实现了Iterable的类就是可迭代的.并且支持增强for循环(数组)。该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。
(Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。Collection接口进程了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)
Iterator接口 Iterator接口定义的方法
Itreator该接口是集合的迭代器接口类,定义了常见的迭代方法
1:boolean hasNext()
判断集合中是否有元素,如果有元素可以迭代,就返回true。
2:E next()
返回迭代的下一个元素,注意: 如果没有下一个元素时,调用next元素会抛出NoSuchElementException
3:void remove()
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作),其实就是移除迭代器中的指针此时指向的元素。
在对迭代器进行操作时,不要直接对原集合进行增删元素等操作,普通迭代器只支持在迭代过程中的删除动作。例


java基础之迭代器和枚举器初解
文章图片
出现以下错误

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at demo1.Test1.main(Test1.java:30)
对于 Iterator 的子接口ListIterator 在迭代list 集合时,还可以对元素进行添加(add(obj)),修改set(obj)的操作。


数组或实现iterable接口的类可使用foreach,增强for循环的底层还是使用了迭代器,这里存在一个疑问,数组是无法获得迭代器的,那么他是如何能够使用增强for循环的?
其实就是在循环数组时用普通for循环遍历,迭代实现iterable接口的类时用的是迭代器遍历
参考Java中foreach循环的实现原理
枚举器Enumeration接口 Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法,与Iterator差不多,用来遍历集合中的元素
但是枚举Enumeration只提供了遍历Vector和Hashtable类型集合元素的功能,这种类型的集合对象通过调用elements()方法获取一个Enumeration对象
然后Enumeratino对象再调用以下方法来对集合中的元素进行遍历。
hasMoreElements():判断Enumeration对象中是否还有数据
nextElement():获取Enumeration对象中的下一个数据
Iterator和Enumeration区别 (01) 函数接口不同
Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。
(02) Iterator支持fail-fast机制,而Enumeration不支持。
fail-fast
Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。
【java基础之迭代器和枚举器初解】而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

    推荐阅读