Iterable iterador de la relación y

Iterable iterador de la relación y

Blog Enlaces de referencia: Enlace

En Java, se puede recorrer la colección Lista de las siguientes maneras:

List<Integer> list = new ArrayList<>();
list.add(5);
list.add(23);
list.add(42);
for (int i = 0; i < list.size(); i++) {
    System.out.print(list.get(i) + ",");
}

Iterator it = list.iterator();
while (it.hasNext()) {
    System.out.print(it.next() + ",");
}

for (Integer i : list) {
    System.out.print(i + ",");
}

La primera es la normal para bucle itera sobre para la segunda, y la tercera es para cada ciclo. Los dos últimos se refieren a Java en el iterador y iterables objetos, a continuación, nos fijamos en la diferencia entre estos dos objetos para cada ciclo y cómo definir una clase de auto-realización.

Iterador 与 Iterable

objeto iterador iterativo en Java, es capaz de iterar conjunto subyacente dependiente de dicha lista. Y en la definición de la interfaz devuelve el método iterables un repetidor, repetidor corresponde al paquete, mientras que el logro interfaz de clase iterables puede soportar para cada bucle.

iterador detalles internos del JDK

Iterator interfaz es principalmente como sigue:

public interface Iterator<E> {
    boolean hasNext();
    E next();
}

El método iterador define para iterar sobre la colección por los anteriores dos métodos, y la implementación específica depende de la realización de diferentes clases, aplicación clase de colección interfaz específica Iterator para implementar iteración.

Se puede encontrar, y no se dio cuenta Lista interfaz Iterator, sino más bien para lograr la interfaz Iterable. Además observación código fuente interfaz Iterable puede encontrar que sólo devuelve un objeto iterador.

public interface Iterable<T> {
  Iterator<T> iterator();
}

Así que podemos usar las siguientes formas de iterar sobre una lista (llamando iterador (método))

Iterator it = list.iterator();
while (it.hasNext()) {
    System.out.print(it.next() + ",");
}

Mientras que el logro de la interfaz Iterable también se puede utilizar para cada ciclo.

para cada principio

De hecho, para cada ciclo depende también del iterador iterador interno, simplemente azúcar sintáctica proporcionada por Java, compilador Java lo convertirá a iterador iterador manera de atravesar. Nos descompilar o menos para cada ciclo:

 for (Integer i : list) {
       System.out.println(i);
   }

compilado

Integer i;
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){
        i = (Integer)iterator.next();        
    }

Podemos ver el Java para cada bucle se logra mediante la mejora de iterador iterador manera.

discusiones en profundidad con las relaciones Iterable Iterator

Hay un problema, ¿por qué no directamente método next () en la interfaz Iterable, otros tipos de aplicación directa en él hasNext (),? La razón es que algunas colecciones pueden atravesar más de una forma, una clase puede entonces implementar Iterable Iterator pluralidad de clases interna, por ejemplo LinkedList los ListItr y DescendingIterator clases internas de dos, respectivamente, para darse cuenta de dos vías y el recorrido inverso de recorrido. Devolviendo una diferente iterador lograr diferentes de recorrido, de modo más flexible. Si las dos interfaces combinados, que no sería capaz de devolver un diferente iterador implementación de la clase a. ListItr código fuente relevante de la siguiente manera:

public ListIterator<E> listIterator(int index) {
        checkPositionIndex(index);
        return new ListItr(index);
    }

    private class ListItr implements ListIterator<E> {
        ...
        ListItr(int index) {
            // assert isPositionIndex(index);
            next = (index == size) ? null : node(index);
            nextIndex = index;
        }

        public boolean hasNext() {
            return nextIndex < size;
        }
        ...
Publicado 22 artículos originales · ganado elogios 0 · Vistas 433

Supongo que te gusta

Origin blog.csdn.net/qq_36956082/article/details/104879509
Recomendado
Clasificación