Uno, introducción al iterador
iterator
La interfaz también es un miembro de la familia colectiva. A diferencia de otros Map
e Collection
interfaces, es iterator
principalmente 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 Map
y la Collection
interfaz 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 iterator
interfaz 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 iterator
interfaz, 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 iterator
procesamiento, cuando el cliente procesa la colección, la entrega a uno más "profesional", lo hace bien.
Dos, interfaz iterable
iterable
La 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. Iterable
La 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 iterable
interfaz es principalmente para obtener iterator
, con un foreach()
método adjunto .
Colección Collection
, List
, Set
es 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 Iterator
que en realidad hay muchas formas de tratar los elementos de la colección. ¿Por qué necesitamos abstraer una capa? Muchas colecciones no implementan directamente Iterator
interfaces, sino Iterable
?
1. Iterator
Los 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 Iterator
interfaz, 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. Iterable
Cada 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 Iterator
clase interna, puede haber dos, por ejemplo ArrayList
, se LinkedList
pueden obtener diferentes, Iterator
no 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.
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 ~