Iterable和Iterator
Iterator
接口位于的位置是java.util.Iterator
,它主要有两个抽象方法供子类实现。hasNext()
用来判断还有没有数据可供访问,next()
用来访问下一个数据。
集合Collection
不是直接去实现Iterator
接口,而是去实现Iterable
接口。
用这个Iterable
接口的iterator()
方法返回当前集合迭代器。
集合Collection
体系的集合都得按照使用iterator()
的方式返回可供遍历的迭代器iterator
。
集合使用Iterable
接口的iterator()
方法返回迭代器Iterator
有很多好处。
比如有两个线程都需要使用迭代器进行遍历集合的操作,如果通过直接实现Iterator
接口来拿迭代器。首先两者拿的是同一个迭代器,并且两者不同步,一个都遍历结束了,另一个都还没开始就无法遍历集合了,但是他本来循环从头开始遍历集合的所有数据的。
如果使用Iterable
接口的iterator()
方法返回迭代器Iterator
,那两者获得的就是不同迭代器了,就互不影响,自己可以按照自己的进度遍历集合就行。
for-each就是迭代器的语法糖,增强版的 for 循环(也叫 “for-each” 循环)在 Java 中是一个特性,它允许你遍历任何实现了 Iterable 接口的集合或者数组。
要使用增强型 for 循环(也称为 for-each 循环)遍历一个集合,集合的类需要实现 java.lang.Iterable
接口。Iterable 接口定义了一个方法 iterator(),它返回一个 Iterator 对象,用于遍历集合的元素。
import java.util.Iterator;
import java.util.NoSuchElementException;
// Iterable位于java.lang包下,不用显式import
public class MyCollection<T> implements Iterable<T> {
private T[] elements;
private int size;
@SuppressWarnings("unchecked")
public MyCollection(int capacity) {
elements = (T[]) new Object[capacity];
size = 0;
}
public void add(T element) {
if (size < elements.length) {
elements[size++