Iterator(迭代器)模式对于我们来讲,应该不会是很陌生,那么在java list中它又是如何实现的的呢?今天先看看ArrayList是如何实现的。
// 迭代器接口定义
public interface Iterator<E> {
// 是否有元素
boolean hasNext();
// 获取元素
E next();
// 移除元素
void remove();
}
写一个简单的示例,看看用法后再看源码。
/**
*
*Java List 迭代器
*
*/
public class JavaListIterator {
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 获取迭代器
Iterator<String> itr = list.iterator();
while(itr.hasNext()){
String str = itr.next();
System.out.println(str);
}
}
}
点击list.iterator(),可以看它的源码如下:
public Iterator<E> iterator() {
return new Itr();
}
它new了一个对象出来,继续往下看。
// ArrayList中的迭代器模式
private class Itr implements Iterator<E> {
// 返回下一个元素的游标,开始为0
int cursor; // index of next element to return
// 返回刚访问的元素
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
// 是否到达最后一个元素了
public boolean hasNext() {
return cursor != size;
}
// 获取元素
@SuppressWarnings("unchecked")
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;
// 将刚访问的元素下标赋值给lastRet,第一次访问后,lastRet = 1
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
整个代码读下来,不算难,可以看出java ArrayList的迭代器是通过下标来访问的,后面再看看LinkedList是如何实现的。通过迭代器在访问的过程是可以删除元素的,这点需要了解,通过for循环的方式是不能删除元素的。