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基础之迭代器和枚举器初解_第1张图片

出现以下错误

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时,添加了同步。

而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

你可能感兴趣的:(java基础之迭代器和枚举器初解)