一、Java Iterator
在Java中,Iterator是一种Java游标
。Java Iterator是一个用于逐个遍历Java对象组件集合的接口。
自Java 1.2 Collection框架以来,可以在Java编程语言中免费使用它。它属于java.util包
。
尽管Java迭代器是在Java 1.2中引入的,但是它仍然不是最古老的可用于遍历Collection对象的元素的工具。Java编程语言中最古老的迭代器是Iterator之前的Enumerator
。Java Iterator接口继承了一开始使用的枚举器迭代器来遍历一些可访问集合,如arraylist。
Java Iterator也被称为Java的通用游标
,因为它适用于Collection框架的所有类。
Java Iterator在read和remove等操作中也有帮助。当我们比较Java Iterator接口和枚举迭代器接口时,我们可以说Java Iterator中可用的方法的名称更精确,使用起来更直接。
二、Java Iterator的优点
Java中的迭代器由于其众多的优点而变得非常流行。
Java Iterator的优点如下:
- 用户可以将这些迭代器应用于Collection框架的任何类。
- 在Java Iterator中,我们可以同时使用读取和删除操作。
- 如果用户使用for循环,他们不能现代化(添加/删除)集合,而如果他们使用Java Iterator,他们可以简单地更新集合。
- Java迭代器被认为是集合API的通用游标。
- Java Iterator中的方法名称非常简单,使用起来也非常简单。
三、Java Iterator的缺点
尽管有许多优点,Java Iterator也有各种缺点。
Java Iterator的缺点如下:
- Java Iterator只保留向前方向的迭代。简单地说,Java Iterator是一个
单向
的Iterator。 - Java Iterator不批准新组件的替换和扩展。
- 在CRUD操作中,Java迭代器不包含create和update等各种操作。
- 与Spliterator相比,Java Iterator不支持在并行模式中遍历元素,这意味着Java Iterator只支持
顺序迭代
。 - 与Spliterator相比,Java Iterator不支持更可靠的执行来遍历大量数据
四、如何使用 Java Iterator
当用户需要使用Java Iterator时,他们必须从希望遍历的对象集合中创建Iterator接口的实例。在那之后,接收到的Iterator将维护底层集合中组件的跟踪,以确保用户将遍历对象集合的每个元素。
如果用户在遍历指向该集合的Iterator时修改了基础集合,那么迭代器通常会确认它,并在下次用户试图从迭代器获取下一个组件时抛出异常。
五、 Java Iterator 方法(源码分析)
它总共包含四个方法:
- hasNext()
- next()
- remove()
- forEachRemaining()
在Java 8中添加了forEachRemaining()方法。让我们详细讨论每种方法:
/**Java Collections Framework
* @param <E> E - 此迭代器返回的元素的类型
*/
public interface Iterator<E> {
/**
* boolean hasNext():是否有下一个元素
* 方法:
* 1)方法类型:无参方法
* 2)功能:如果迭代中还有更多的元素,则返回true;如果没有剩余元素,则返回false。
* 如果迭代中没有其他元素了,那么就不需要调用next()方法。
* 3)返回值:true or false
* 4)简单地说,我们可以说该方法用于确定是否调用next()方法。
*/
boolean hasNext();
/**
* 方法:
* 1)方法类型:无参方法
* 2)功能:它返回E,即遍历中的下一个元素。如果迭代或对象集合没有更多的元素可以迭代,那么它将
* 抛出NoSuchElementException。
* 3)返回值:E 迭代中的下一个元素
* 4)异常 :NoSuchElementException - 如果迭代没有更多的元素
*/
E next();
/**
* 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 此方法只能调用一次next() 。 如 * 果底层集合在迭代过程中以任何方式进行修改而不是通过调用此方法,则迭代器的行为是未指定的。
*
* 实现要求:
*默认的实现抛出的一个实例UnsupportedOperationException并执行其他操作。
* 方法:
* 1)方法类型:无参方法;此方法没有返回类型。
* 2)功能:删除遍历底层集合的迭代器返回的最后一个元素。每次调用next()方法时,remove()方法
* 几乎不会被请求一次。如果迭代器不支持remove操作,则会抛出异常,如果还没有调用下一个方
* 法,则也会抛出异常
* 3)返回值:没有返回值
* @throws UnsupportedOperationException -如果 remove操作不会被这个迭代器支持
* @throws IllegalStateException - 如果 next方法尚未被调用,或者 remove方法在上次 * 调用 next方法之后已经被调用
*/
default void remove() {
throw new UnsupportedOperationException("remove");
}
/* 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。 如果指定了该顺 * 序,则按迭代的顺序执行操作。 动作抛出的异常被转发给呼叫者。
*
* @实现要求:
* <p>The default implementation behaves as if:
* <pre>{@code
* while (hasNext())
* action.accept(next());
* }</pre>
* 方法:
* 1)方法类型:有参方法。它接受action作为参数。拿action就是要去执行。
* 2) 方法:此方法对集合的所有左侧组件执行特殊操作,直到所有组件被消耗或操作引发异常。
* 操作引发的异常被传递给调用者。如果参数为空,则抛出NullPointerException。
* 3)返回值:没有返回值
* @参数 action The action to be performed for each element
* @异常 NullPointerException - 如果指定的动作为空
*/
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
六、 Java Iterator 实例
现在是时候执行一个Java程序来说明Java Iterator接口的优势了。下面的代码生成城市名称的数组列表。然后应用ArrayList的iterator()方法初始化一个迭代器。之后,遍历列表以表示每个元素。
public class IteratorExample {
public static void main(String[] args) {
ArrayList<String> cityNames = new ArrayList<String>();
cityNames.add("广州");
cityNames.add("深圳");
cityNames.add("重庆");
cityNames.add("上海");
cityNames.add("东莞");
// 实例化: iterator 迭代 cityNames
Iterator iterator = cityNames.iterator();
System.out.println("cityNames 元素:");
// 判断 iterator.hasNext() 是否有下一个元素
while (iterator.hasNext()){
// 返回 iterator 迭代中的下一个元素
System.out.println(iterator.next());
}
}
}
七、总结
- Java Iterator是Java编程语言在Java 1.2 Collection框架中添加的接口。它属于
java.util包
。 - 它是用于遍历集合框架的对象的Java游标之一。
- Java Iterator用于
逐个
迭代集合对象的组件。 - Java Iterator也被称为Java的通用游标,因为它适用于Collection框架的所有类。
- Java Iterator还同时支持
read和remove
等操作。 - 与Enumeration Iterator的方法名相比,Iterator类的方法名非常简单,易于使用。