集合中接口继承结构,这里以ArrayList实现类为例说明
- Iterable接口
-
Colection接口
- List接口
- ArryList实现类
- List接口
-
public interface Collection<E> extends Iterable<E>{
Iterator<T> iterator();
}
public interface List<E> extends Collection<E>{
Iterator<E> iterator();
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
Iterable(java.lang.Iterable) 接口和Iterator(java.util.Iterator) 接口
- Iterable 接口是所有集合接口的父接口, Collection extends Iterable, 该接口内部有一个重要的抽象方法 iterator()
- Iterator iterator() 返回Iteartor接口,该接口含有两个重要的抽象方法,分别是next() 和 hasNext(),也就是使用迭代器遍历的两个方法。
public interface Iterator<E> {
boolean hasNext();
E next();
}
- 对于接口中的抽象方法,实现类必须要对抽象就行重写,如下所示,在ArrayList类中实现的iterator方法如下所示,实现的具体内容源码如下。
public Iterator<E> iterator() {
return new Itr();
}
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() {
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;
return (E) elementData[lastRet = i];
}
}
- 在内部类中实现的两个方法我们进行简化后分析其具体过程。
public Iterator<E> iterator() {
return new Itr();//通过多态的方式返回接口的实现类
}
//ArrayList内部实现类
private class Itr implements Iterator<E> {
int cursor; // 模拟指针指向下一个需要返回的元素
int lastRet = -1; // 用来保存
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {
return cursor != size;
}
// 该方法作用 1.使corsor指针后移,2.输出移动指针移动前的值
public E next() {
int i = cursor;
// elementData是arrayList的底层数组,这里创建一个数组引用指向该数组
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
下面用一个具体的例子来说明:
List<String> list = new ArrayList<>();
//向集合中添加元素
Collections.addAll(list,"a1","b2","c3");
//遍历 这里写法不懂得可以参考 https://editor.csdn.net/md/?articleId=116519094
for (Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
//或者是采用常规写法
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
- 具体流程图如下: