美文网首页
java基础之迭代器和枚举器初解

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

作者: 沈默的头号狗腿 | 来源:发表于2018-06-15 21:46 被阅读0次

迭代器

为了方便的处理集合中的元素,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()

         从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作),其实就是移除迭代器中的指针此时指向的元素。

在对迭代器进行操作时,不要直接对原集合进行增删元素等操作,普通迭代器只支持在迭代过程中的删除动作。例

出现以下错误

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基础之迭代器和枚举器初解

    迭代器 为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和...

  • Vector中的枚举

    枚举就是Vector 特有的取出方式。发现枚举和迭代器很像。其实枚举和迭代是一样的。 因为枚举的名称以及方法的名称...

  • java迭代器

    为了从一个系列中生成连续的元素,我们可以使用java迭代器。这是对枚举界面的改进。迭代器代替了 [从jdk 1.2...

  • java集合分类

    java的集合主要分为List列表、Set集合、工具类(Iterator迭代器、Enumeration枚举类、Ar...

  • 10.迭代器与生成器

    一、迭代器 1). 迭代器概述 类比Java中的迭代器,参考迭代器模式https://www.jianshu.co...

  • Ruby 语句与控制结构

    迭代器和可枚举对象 迭代器的描述并不准确,像”期待一个关联代码块的方法“这样的描述更加准确一些。迭代器是 Ruby...

  • Java 容器基础

    一、迭代器 1. Iterator: 对 collection 进行迭代的迭代器。迭代器取代了 Java C...

  • java基础之类加载器初解

    类加载的过程 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进...

  • java设计模式---迭代器模式

    迭代器模式 java迭代器模式,也叫java iterator模式,下面举个以模仿java的collecton、A...

  • TypeScript基础入门之迭代器和生成器

    转发 # TypeScript基础入门之迭代器和生成器 迭代性 如果对象具有Symbol.iterator属性的实...

网友评论

      本文标题:java基础之迭代器和枚举器初解

      本文链接:https://www.haomeiwen.com/subject/trqjeftx.html