迭代器(Iterator)概念:
在java里面有一个接口:Iterator。
java里面有很多集合,每种集合元素存储的方式不一样,取的方式可能也不一样。每一个都学习怎么获取很不现实,这时候就出现了迭代器,实现了Iterator迭代器接口的集合 就有了统一的功能 迭代(遍历)
如何获得一个迭代器
1.因为迭代器是Java为了给集合(and数组)给定统一的遍历的行为规范,所以Collection接口继承了Iterable接口。
public interface Iterable<T>
实现这个接口允许对象成为 "foreach" 语句的目标。
从以下版本开始:
1.5
Iterable接口中唯一的一个抽象方法
方法摘要
iterator()
返回一个在一组 T 类型的元素上进行迭代的迭代器。2.并且继承了Iterable接口中的抽象方法,交给Collection的子类去实现
Iterator<E>
iterator()
返回在此 collection 的元素上进行迭代的迭代器。返回类型 应该是一个迭代器的实现类的对象。但这里使用了接口的多态 Iterator接口去引用这个对象 ,无需关注具体这个对象是什么,因为我们的关注重心不在Iterator接口的实现类对象 而在于获得到的这个迭代器对象。
terator<T> iterator()返回一个在一组 T 类型的元素上进行迭代的迭代器。
返回:
一个迭代器。
迭代器中的方法
方法摘要 boolean
hasNext()
如果仍有元素可以迭代,则返回 true。E
next()
返回迭代的下一个元素。void
remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。共有三个抽象方法,我们学习两个:
hasNext
boolean hasNext()
如果仍有元素可以迭代,则返回 true。(换句话说,如果 next 返回了元素而不是抛出异常,则返回 true)。
返回:
如果迭代器具有多个元素,则返回 true。
next
E next()
返回迭代的下一个元素。
返回:
迭代的下一个元素。
抛出:
NoSuchElementException
- 没有元素可以迭代。
Iterator的实现过程
当执行coll.iterator();时,会创建一个指针,指向-1的位置。
当执行it.hasNext()时,会判断指针指的位置有没有下一个元素。
当执行it.next()时,首先把下一个元素取出来,然后指针往后移动一位。只有执行next()时,指针才往后移动。
迭代器的并发修改异常
在使用迭代器进行遍历的时候,不允许修改集合的长度。否则会报:java.util.ConcurrentModificationException。不改长度是指不能进行增删元素的操作,但是可以改元素。
参考:https://blog.csdn.net/Hurricane_m/article/details/89290154 原因 以及对应了解决办法
增强for循环
增强的for循环是jdk1.5新特性。
jdk1.5之后,出现了新的接口java.lang.Iterable,Collection开始继承Iterable。而Iterable接口出现目的就是为了实现增强的for循环。
凡是见到的集合,还有数组,都可以使用增强for循环。
参考:https://blog.csdn.net/Hurricane_m/article/details/89259201