Analyse du code source JDK
Le modèle d'itérateur est largement utilisé dans de nombreuses collections de JAVA, voyons comment utiliser le modèle d'itérateur dans le code source JAVA.
Après avoir lu ce code, est-il très familier? Il est fondamentalement similaire au code ci-dessus. Les collections à une seule colonne utilisent des itérateurs, nous prenons ArrayList comme exemple pour illustrer
- List: Classe d'agrégation abstraite
- ArrayList: classe d'agrégation concrète
- Itérateur: itérateur abstrait
- list.iterator (): Ce qui est retourné est
Iterator
un objet itérateur concret qui implémente l' interface
Jetons un coup d'œil à l'implémentation du code de ArrayList en particulier
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // 下一个要返回元素的索引
int lastRet = -1; // 上一个返回元素的索引
int expectedModCount = modCount;
Itr() {}
//判断是否还有元素
public boolean hasNext() {
return cursor != size;
}
//获取下一个元素
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];
}
...
}
Cette partie du code est relativement simple, iterator
renvoyant approximativement un Iterator
objet instancié dans la méthode . Itr est une classe interne qui implémente l' Iterator
interface et réécrit les méthodes abstraites qu'elle contient.
Remarque:
Lorsque nous développons avec JAVA, si nous voulons utiliser le mode itérateur,
Laissez simplement notre propre classe de conteneur définie implémenter
java.util.Iterable
et implémenter sa méthode iterator ()Faites-le
java.util.Iterator
simplement renvoyer une classe d'implémentation.