迭代特性
要使一个类可迭代
- 需要实现 Iterable 接口
- 实现
public Iterator<E> iterator()
方法
- 实现
- 并写一个内部类来实现iterator接口
- 实现
public boolean hasNext()
方法 - 实现
public E next()
方法。 E是泛型,类的代表
- 实现
源代码
以下是ArrayList 关于迭代部分的代码
//实现 `public Iterator<E> iterator()` 方法
public Iterator<E> iterator() {
return new Itr();
}
//实现iterator接口的内部类
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}
//实现 `public boolean hasNext()` 方法
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
//实现 `public E next() `方法
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
使用
@Test
void testArrayIterable()
{
ArrayList<Integer> a = new ArrayList<Integer>();
for(int i = 0;i<10;i++)
a.add(i);
Iterator<Integer> it = a.iterator();// 拿到数据对象
StdOut.print("ArrayList:");
while(it.hasNext()) // 判断数据遍历是否还能继续
StdOut.print(it.next()+" "); //取出数据
StdOut.println();
}
输出
ArrayList:0 1 2 3 4 5 6 7 8 9