colección java [7] --- Explicación detallada de las similitudes y diferencias entre iterador e Iterable

Listo para ir

Uno, introducción al iterador

iteratorLa interfaz también es un miembro de la familia colectiva. A diferencia de otros Mape Collectioninterfaces, es iteratorprincipalmente para facilitar el recorrido de todos los elementos de la colección, que se utiliza para acceder iterativamente a los elementos de la colección, lo que equivale a definir la especificación de elementos transversales, y el otro Mapy la Collectioninterfaz define principalmente el especificación de elementos de almacenamiento.

boolean hasNext(); // 是否有下一个元素

E next();   // 获取下一个元素

// 移除元素
default void remove() {
        throw new UnsupportedOperationException("remove");
    }

// 对剩下的所有元素进行处理,action则为处理的动作,意为要怎么处理
default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

¿Por qué necesitamos una interfaz de iterador?

En primer lugar, sabemos que la iteratorinterfaz es para definir la especificación de las colecciones atravesadas, y también es una abstracción, abstrayendo los métodos transversales en diferentes colecciones, de modo que al atravesar, no es necesario conocer la estructura interna de las diferentes colecciones. .

¿Por qué necesitamos la abstracción?

Suponiendo que no hay una iteratorinterfaz, sabemos que solo podemos pasar el índice al atravesar, como

for(int i=0;i<array.size();i++){
    T item = array[i];
}

De esta forma, el grado de acoplamiento es relativamente alto, si cambia la estructura de datos utilizada, es necesario cambiar el método de escritura, lo que no favorece el mantenimiento del código existente. De lo contrario iterator, el cliente debe mantener el puntero, que es equivalente a la autoridad delegada, lo que provocará cierto grado de confusión. La abstracción es extraer la función transversal y entregarla al iteratorprocesamiento, cuando el cliente procesa la colección, la entrega a uno más "profesional", lo hace bien.

Dos, interfaz iterable

iterableLa interfaz es en realidad una de las principales interfaces de la familia de colecciones de Java. Se puede considerar que la implementación de esta interfaz tiene la capacidad de obtener iteradores. IterableLa interfaz apareció en JDK 1.5 En ese momento, solo existían iterator()métodos, principalmente definiendo la especificación de los elementos en la colección iterativa. Literalmente, se refiere a una interfaz que se puede iterar.

El código fuente es el siguiente:

// 返回一个内部元素为T类型的迭代器(JDK1.5只有这个接口)
Iterator<T> iterator();

// 遍历内部元素,action意思为动作,指可以对每个元素进行操作(JDK1.8添加)
default void forEach(Consumer<? super T> action) {}

// 创建并返回一个可分割迭代器(JDK1.8添加),分割的迭代器主要是提供可以并行遍历元素的迭代器,可以适应现在cpu多核的能力,加快速度。
default Spliterator<T> spliterator() {
    return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

Como se puede ver en el código fuente anterior, la iterableinterfaz es principalmente para obtener iterator, con un foreach()método adjunto .
Colección Collection, List, Setes la clase de implementación Iterable, ellos y sus subclases puede usar foreach para iterar.

En tercer lugar, ¿por qué el iterador también necesita Iterable?

Hemos visto Iteratorque en realidad hay muchas formas de tratar los elementos de la colección. ¿Por qué necesitamos abstraer una capa? Muchas colecciones no implementan directamente Iteratorinterfaces, sino Iterable?

1. IteratorLos métodos centrales de la interfaz next () o hashNext (), previous (), etc., dependen en gran medida de los punteros, que es la posición actual de la iteración. Si Collection implementa directamente la Iteratorinterfaz, entonces el objeto de la colección tiene la capacidad de un puntero, y la transferencia de diferentes métodos internos hará que el método next () sea bloqueado entre sí. Solo hay una posición de iteración, que interfiere entre sí.
2. IterableCada vez que obtenga un iterador, devolverá un inicio desde el principio y no interactuará con otros iteradores.
3 también es una solución como esta, un tipo de acoplamiento, hay más de una colección de alguna Iteratorclase interna, puede haber dos, por ejemplo ArrayList, se LinkedListpueden obtener diferentes, Iteratorno se realiza la misma operación.

[Perfil del autor] :
Qin Huai, autor de la cuenta pública [ Tienda de comestibles Qin Huai ], el camino hacia la tecnología no es a la vez, las montañas son altas y los ríos son largos, aunque sea lento, lo hará Nunca pares. Dirección de escritura personal: análisis de código fuente de Java, JDBC, Mybatis, Spring, redis, distribuido, oferta, LeetCode, etc., escribe cada artículo con cuidado, no me gusta la fiesta del título, no me gustan las campanas y silbidos, principalmente escribe series de artículos, sin garantía Lo que escribí es completamente correcto, pero garantizo que lo que escribí ha sido practicado o buscado para obtener información. Espero corregir cualquier omisión o error.

¿Qué escribí en 2020?

Notas de programación de código abierto

El tiempo es precioso los días de semana, solo puedes usar el tiempo de la tarde y el fin de semana para aprender a escribir, prestame atención, crezcamos juntos ~

Supongo que te gusta

Origin blog.51cto.com/13604316/2655953
Recomendado
Clasificación