Java 迭代器概述①


一、迭代器是什么?

Iterator接口实现了4个方法:

public interface Iterator<E> {
	E next();
	boolean hasNext();
	void remove();
	default vooid forEachReaming(Consumer<? super E> action);
}

反复调用next方法,可以逐个遍历访问集合的每一个元素。但是,达到了集合末尾,next方法将会给出一个NoSuchElementException。因此,需要在调用next之前调用hashNext方法。若迭代器对象还有多个供访问的元素。这个方法就会返回ttue,若想要查看集合所有元素,则请求一个迭代器,并且在hasNext返回true时反复调用next方法,如下代码:

Collection<String> c = ...;
Iterator<String> iter = c.iterator;
while (iter.hasNext()) {
	String element = iter.next();
	do something with element;
}

利用forEach循环可以更加简单的便是同样的循环操作:

for (String element : c) {
	do something with element;
}

编译器将会把forEach循环翻译为带有迭代器的循环。
forEach循环可以和任何实现了Iterator接口的对象一起工作,这个接口只包含一个抽象方法:

public interface Iterator<E> {
	Iterator<E> iterator();
}

Collection接口拓展了Iterator接口;所以,对于标准类库中的任意集合都可以使用forEach循环。
在Java8中,可以调用forEachRemaning方法并且提供一个lambda表达式,对迭代器的每一个元素调用这个表达式,直至没有元素为止:

iterator.forEachRemaining(element -> do something with element);

元素被访问的顺序取决于集合的类型,对ArrayList迭代,将会从索引0开始,每迭代一次,索引+1。
然而如果访问HashSet集合元素,每个元素将会按照某种随机次序出现,虽然可以确定迭代过程遍历到集合的所有元素,无法预知元素被访问的次序。这对于计算总和或者统计符合某个条件的元素个数这类与顺序无关的操作来说,这不是问题。


二、Java集合类库的迭代器和其他类库迭代器的差异

在传统集合类库中,例如C++的STL,迭代器是根据数组索引建模的,若给定这样一个迭代器,就可以查看指定位置上的元素,知道数组索引就可以知道数组指定位置的元素;。
但是Java迭代器认为是位于两个元素之间,调用next方法,迭代器就越过下一个元素,返回刚刚越过的那个元素引用。
在这里插入图片描述

注意:
这里还有一个有用的推论,可以把Iterator.next和InputStream.read看作是等效的,从数据流读取一个字节,就会自动的消耗掉这个字节,下一次调用read将会消耗并且返回输入的下一个字节。利用同样的方式,反复调用next就可以读取集合所有元素。


三、Iteator接口api使用注意事项!

Iterator接口的remove方法会删除上次调用next返回的元素,在大多数情况下,在决定删除某一个元素之前应该先看一下这个元素是很具有实际意义的。
然而,如果想要删除指定位置上的元素,仍然需要越过这个元素,如下,删除字符串集合中第一个元素的方法:

Iterator<String> it = c.iterator();
it.next();	//skip over the first element
it.remove();	//new remove it

更重要的是,对next方法和remove方法的调用具有互相依赖性,若调用remove之前没有next将会是不合法的!
如果你这样做,将会抛出IllegalStateException异常。
若想要删除两个相邻的元素,不可以直接这样调用!!:

it.remove();
it.remove();	//ERROR!!!

恰恰相反,必须首先调用next越过将要删除的元素。

it.remove();
it.next()
it.remove();	//OKK!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值