JAVA Iterator接口表示一个对象,该对象能够遍历Java对象的集合,一次迭代一个对象 。Iterator 接口是Java中用于迭代对象集合的最古老的机制之一(尽管不是最早的-Enumerator 早于Iterator ) 。
使用java的Iterator ,首先从需要迭代的对象集合中获取一个Iterator 实例 。获得的迭代器跟踪底层集合中的元素,以确保遍历所有元素 。如果在遍历指向该集合的迭代器时,修改基础集合,迭代器通常会检测到它,并在下次尝试从迭代器获取下一个元素时抛出异常 。下面会继续讲述 。
Iterator核心方法Iterator接口非常简单,下面是核心方法:
方法
说明
hasNext()
如果Iterator还有元素则返回true,否则返回false
next()
返回Iterator的下一个元素
remove()
从Iterator代的集合中移除next()返回的最新元素 。
forEachRemaining()
迭代Iterator中所有剩余的元素,并调用一个Lambda表达式,将剩余的每个元素作为参数传递给Lambda表达式 。
获取Iterator通常情况下,将通过从包含多个嵌套对象的Java对象获取迭代器来与它交互 。标准的java集合接口Collection 包含一个iterator()方法,调用iterator()方法可以从Collection中获取一个迭代器 。可以从java集合各个数据结构中获取Iterator 例如, List, Set, Map, Queue, Deque或者 Map 。下面是从各个集合中获取Iterator 的例子:
List<String> list = new ArrayList<>();list.add("one");list.add("two");list.add("three"); Iterator<String> iterator = list.iterator(); Set<String> set = new HashSet<>();set.add("one");set.add("two");set.add("three"); Iterator<String> iterator2 = set.iterator();
迭代Iterator可以用while 循环迭代Iterator ,下面是例子:
Iterator iterator = list.iterator(); while(iterator.hasNext()) { Object nextObject = iterator.next(); }
上面的例子使用了Iterator 的两个方法,第一个 hasNext(),如果Iterator 还有元素则返回true 。换句话说,如果迭代器还没有遍历从中获取迭代器的集合中的所有元素,hasNext()方法将返回true 。如果迭代器迭代了底层集合中的所有元素,hasNext()方法返回false 。
第二个方法是next(),next()返回Iterator 的下一个元素 。
迭代顺序Iterator的顺序取决于迭代的集合,例如从List中获取的Iterator ,则元素的存储顺序与List中的元素引用,另一方面,从Set中获得的迭代器并不保证集合中元素的精确迭代顺序 。
List的Iterator下面是从List 实例中获取Iterator :
List list = new ArrayList(); list.add("123");list.add("456");list.add("789"); Iterator iterator = list.iterator();
Set的Iterator下面是从Set中获取Iterator 实例:
Set set = new HashSet(); set.add("123");set.add("456");set.add("789"); Iterator iterator = set.iterator();
迭代时修改集合有些集合使用Iterator 迭代时不允许修改集合,否则在迭代器下一次调用next()方法时,会抛ConcurrentModificationException ,下面是例子:
package com.ck.collection; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class IteratorTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("123"); list.add("456"); list.add("789"); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { String value = https://www.isolves.com/it/cxkf/yy/JAVA/2020-08-31/iterator.next(); if(value.equals("456")){ list.add("999"); } } }}
【Java集合-Iterator】执行结果:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at com.ck.collection.IteratorTest.main(IteratorTest.java:19)
如果通过Iterator迭代集合的同时修改了集合,则会引发ConcurrentModificationException,因为迭代器与集合不同步 。
迭代时移除元素Java迭代器接口有一个remove()方法,可以从底层集合中移除next()刚刚返回的元素,调用remove()方法不会抛ConcurrentModificationException 异常,下面是代码:
推荐阅读
- Google开源Java图片处理类库Thumbnail
- JavaScript 各种遍历方式详解
- JavaScript的宏任务和微任务
- 「OOM」Java heap space原因与解决
- 一个用Java实现的超轻量级RESTful Web服务示例
- 微信开发最新Java SDK来了:WxJava3.9.0
- JavaWeb - 开发环境搭建和 Shell 编程
- 分析网页 JavaScript Bundles 的几种方法
- Java开发中的支付业务简易流程
- 一文读懂jar包的小秘密