Post Top Ad

Your Ad Spot

viernes, 5 de julio de 2019

Colecciones Java: La interfaz de la lista

Introducción

El Java Collections Framework es un marco fundamental y esencial que cualquier desarrollador de Java sólido debe conocer como la palma de su mano.
Una colección en Java se define como un grupo o colección de objetos individuales que actúan como un solo objeto.
Hay muchas clases de colección en Java y todas ellas extienden las interfaces java.util.Collectionjava.util.MapEstas clases en su mayoría ofrecen diferentes formas de formular una colección de objetos dentro de un solo objeto.
Java Collections es un marco que proporciona numerosas operaciones en una colección: búsqueda, clasificación, inserción, manipulación, eliminación, etc.
Esta es la primera parte de una serie de artículos de Colecciones Java:
  • La interfaz de la lista (usted está aquí)
  • La interfaz de conjunto
  • Colas, Deques, Stacks ( próximamente )
  • La interfaz del mapa ( próximamente )

Problemas con matrices

Las matrices son una de las primeras cosas con las que se introduce un nuevo desarrollador de Java horneado.
Una matriz de objetos, muy similar a una colección, representa un grupo de objetos como un solo objeto.
Tanto una matriz como una colección son un objeto que representa varios otros objetos, así que ¿por qué hay una necesidad de ambos?
Consideremos una colección de productos:
Product door = new Product("Wooden Door", 35);  
Product floorPanel = new Product("Floor Panel", 25);  
Tenemos una puerta de madera y un panel de la puerta, que pesan 35 kg y 25 kg respectivamente. Estos son POJOs , lo que significa que solo tienen un par de métodos get y set y un toString()método.
Con esto, es bastante simple crear una instancia de una matriz de estos objetos:
Product[] products = { door, floorPanel };  

Matrices de impresión

Hay muchas razones por las que alguien querría imprimir una matriz, incluida la depuración o la devolución de los resultados:
System.out.println(products);  
Sin embargo, cuando intentamos imprimirlo, recibimos un resultado que no es muy amigable para los humanos:
com.demo.collections.Product;@14ae5a5  
De hecho, necesitamos confiar en la clase de ayuda java.util.Arrayspara obtener un resultado razonable:
System.out.println(Arrays.toString(products));  
Esta vez, estamos viendo algo que tiene más sentido:
[Product{name="Wooden Door", weight=35}, Product{name="Floor Panel", weight=25}]

Agregar y quitar elementos

Nuestra colección de productos ahora es más grande, y se supone que debemos agregar una ventana a la matriz:
final Product window = new Product("Window", 15);  
products = add(window, products);  
System.out.println(Arrays.toString(products));


public static Object[] add(Object[] array, Object... elements) {  
    Object[] tempArray = new Object[array.length + elements.length];
    System.arrayCopy(array, 0, tempArray, 0, array.length);

    for(int i = 0; i < elements.length; i++) {
        tempArray[array.length+i] = elements[i];
        return tempArray;
    }
}
Este es exactamente el tipo de situación en la que probablemente prefieras dispararte en la pierna, porque las matrices no cambian de tamaño .
Para agregar un elemento, tenemos que hacer una copia de la matriz en una nueva matriz, instanciarla con los nuevos elementos y asignar la nueva matriz a nuestra variable de referencia.
Las matrices son una construcción de bajo nivel y no nos ofrecen muchas características, mientras que las colecciones están diseñadas para combatir ese problema y ofrecen muchas características y una gran funcionalidad.

Colecciones

El Java Collections Framework se envía con el JDK en sí. Vale la pena recordar que en los viejos tiempos, especialmente para las personas que escribían el código C , a los desarrolladores no se les presentaban estructuras de datos para elegir. De hecho, la gente solía escribir sus propias estructuras de datos, lo que algunos incluso lo hacen hoy en día.
Hay razones legítimas de rendimiento por las que alguien puede encontrar una estructura de datos personalizada que sea ideal para un proyecto específico. Pero, para la mayoría de los desarrolladores, confiar en el marco existente es una buena opción.
Java se utiliza para construir sistemas y aplicaciones grandes y complejos. Dicho esto, casi todas las aplicaciones Java terminarán utilizando el marco de las colecciones en un momento u otro.
Todas las clases de recopilación tienen una estructura de datos subyacente que están implementando: árboles , tablas de Hash , HashMaps , colas , etc. La implementación de estas estructuras de datos, aunque potencialmente divertida, puede ser muy difícil: hay muchos aspectos que debes acertar . No hay necesidad de reinventar la rueda si ya se le ha servido, a menos que desee practicar y desafiarse a sí mismo para encontrar soluciones innovadoras y alternativas.
Vamos a echar un vistazo a algunos tipos diferentes de colecciones en Java:
  • Listas - Una colección secuencial (ordenada). Mantienen un registro de las posiciones de todos los elementos, como matrices, y ofrecen operaciones de búsqueda, iteración y vista de rango de sus elementos. Las listas pueden tener elementos duplicados.
  • Conjuntos : impone restricciones de exclusividad: no puede contener elementos duplicados. No se ocupa del orden de iteración en sí mismo, ya que modela la abstracción de conjuntos matemáticos. Los conjuntos no ofrecen ninguna funcionalidad adicional aparte de la heredada de Colecciones .
  • Colas : introduzca el orden de modificación, es decir, si agrega elementos en un orden determinado, debe seguir un orden determinado. Las colas ofrecen operaciones adicionales de inserción, eliminación e inspección de sus elementos. Es único para las colas seguir la estructura FIFO (primero en entrar , primero en salir).
  • Deques : similares a las colas, las colas de doble extremo (acortadas a deques) ofrecen además la posibilidad de realizar operaciones en elementos de ambos lados de la cola.
  • Mapas : aunque las implementaciones de java.util.Mapno se consideran "colecciones verdaderas", ofrecen operaciones de vista de colección que prácticamente les permiten la manipulación a nivel de colección. Esta colección no es una colección de valores individuales, sino pares. Estas son asociaciones entre claves y valores únicos (Mapas) que se pueden consultar desde esas claves. Es importante tener en cuenta que las claves son únicas y que cada clave está asociada con un valor, pero un valor puede asociarse con más de una clave.

Interfaz Collection

Como se mencionó anteriormente, todas las interfaces de colección dentro de la API de Java extienden una interfaz común - java.util.CollectionEsta interfaz principal proporciona todas las funcionalidades de colecciones comunes.
Cada sub-interfaz tiene varias implementaciones, y algunas de estas sub-interfaces ofrecen operaciones adicionales:
colección_de_colecciones
El punto clave a comprender es que cada interfaz define características de comportamiento y funcionales en las que podemos utilizar múltiples estructuras de datos, mientras que las implementaciones definen características de rendimiento, utilizan una estructura de datos específica y son instanciables.
Los métodos más utilizados en la Collectioninterfaz son:
Nombre del métodoDescripción del método
tamaño()Consigue el número de elementos en la Colección.
esta vacio()Verdad si tamaño () == 0, falso de lo contrario
añadir (elemento)Agrega el elemento al principio de esta colección.
addAll (colección)Agrega todos los elementos de la colección de argumentos a esta colección
eliminar (elemento)Eliminar el elemento de esta colección.
removeAll (colección)Eliminar todos los elementos de la colección de argumentos de esta colección.
retenerAll ()Elimine todos los elementos de esta colección que no estén en la colección de argumentos.
contiene (elemento)Verdadero si el elemento está en esta colección, falso de lo contrario
contiene todo (colección)Verdadero si todos los elementos de la colección de argumentos están en esta colección.
claro()Eliminar todos los elementos de esta colección.

Liza

La primera, y probablemente la interfaz más utilizada - java.util.List.
Cada elemento dentro de la lista tiene un índice, un intvalor que define su posición. El conteo de indexación comienza en 0, lo mismo que la indexación que podemos encontrar con matrices.
La java.util.Listinterfaz también agrega un par de otras operaciones más allá de las operaciones de recolección comunes comunes:
  • get(int index)
  • set(int index, Object object)
Estas operaciones se explican por sí mismas y no necesitan más explicación. Sin embargo, echemos un vistazo a algunos ejemplos de código.

Añadiendo un elemento

Usando el add()método, podemos agregar fácilmente objetos a nuestra lista:
List<String> products = new ArrayList<>();  
products.add("Mug");  
products.add("Wallet");  
products.add("Phone");  
System.out.println(products);  
Salida:
[Mug, Wallet, Phone]
Nota : estamos instanciando la lista como su implementación concreta ArrayListEn la mayoría de los casos, usaríamos esta implementación para una lista .
Otra nota : puede especificar el tamaño inicial de ArrayList a través del constructor para evitar cambiar el tamaño si conoce un tamaño definitivo.
La interfaz también proporciona otra versión del add()método, incluido un índice. En este caso, agregamos el elemento al índice dado, y si el índice ya está tomado por otro elemento, todos los elementos después del agregado un desplazamiento a la derecha en uno:
products.add(2, "Pen");  
System.out.println(products);  
Salida:
[Mug, Wallet, Pen, Phone]

Recuperando elementos

Usando el get()método con el índice dado, podemos recuperar un elemento específico en la lista:
System.out.println(products.get(0));  
Salida:
[Mug]

Removiendo elementos

Usando el remove()método, podemos eliminar un elemento de la lista. Al llamar a este método, se devolverá el elemento y se desplazarán los elementos después de un índice para rellenar el agujero existente en la secuencia:
System.out.println(products.remove(1));  
Salida:
[Wallet]

Elementos de ajuste

Usando el set()método, podemos reemplazar un elemento existente dado un índice:
products.set(1, "Book");

System.out.println(products);  
Salida:
[Mug, Book, Phone]

Buscando elementos

Usando el indexOf()método, también podemos buscar valores, dado un índice. Si la búsqueda falla y no existe ningún objeto con el índice dado, la lista volverá -1En el caso de múltiples objetos iguales, la lista devolverá solo el primer índice.
Usando el lastIndexOf()devolverá el último índice del elemento dado.
System.out.println(products.indexOf(5));  
Salida:
-1

Elementos iterativos

Aunque es posible iterar con fory hacer enhanced-forbucles, la interfaz proporciona dos nuevas clases auxiliares que nos permiten iterar a través de listas, IteratorListIterator:
for (Iterator<E> iterator = list.iterator(); iterator.hasNext(); ) {  
    E element = iterator.next();
    element.someMethod();
    iterator.remove(element);
    //...
}

for (ListIterator<E> iterator = list.listIterator(); iterator.hasNext(); ) {  
    E element = iterator.next();
    element.someMethod();
    iterator.remove(element);
    //...
}
Nota : ListIteratorofrece más control sobre la iteración de la lista, ya que permite el recorrido en ambas direcciones, mientras que Iteratorsolo permite el recorrido en una dirección.
Además, Java 8 nos presenta una forma realmente sencilla de imprimir los elementos utilizando una referencia de método:
list.forEach(System.out::println);  

Implementaciones y diferencias

ArrayList : implementa java.util.Listcomo una matriz de cambio de tamaño dinámicamente:
  • Buena implementación de propósito general
  • Usado por defecto
  • Más CPU caché simpático
LinkedList : implementa java.util.Listcomo una lista doblemente enlazada:
  • Peor rendimiento para muchas operaciones.
  • Utilízalo al añadir elementos al inicio.
  • Se usa cuando se agrega / quita mucho
En términos generales, ArrayListes mucho más utilizado que LinkedListY para citar a Joshua Bloch, el hombre que escribió LinkedList:
"¿Alguien realmente usa LinkedList? Lo escribí y nunca lo uso".

Comparación de rendimiento

performance_comparison_arraylist_vs_linkedlist
Debido a sus diferentes naturalezas, estas implementaciones tienen diferentes enfoques y tiempos de ejecución de los métodos.
Dependiendo de los requisitos, tendrás que elegir cuál usar. En términos generales, debido a su naturaleza de doble enlace, LinkedListes bueno para la adición y eliminación frecuentes, mientras que ArrayListes bueno para la búsqueda debido al acceso aleatorio.

Conclusión

El marco de Java Collections es un marco fundamental que todo desarrollador de Java debe saber cómo usar.
En el artículo, hemos hablado sobre las colecciones en general, los problemas con los arreglos y cómo el marco los combate. Luego, saltamos a las implementaciones de esta interfaz, a sus ventajas y desventajas, así como a las operaciones que seguramente usará en un momento u otro.
Si está interesado en leer más sobre las interfaces de colección, continúe leyendo - Colecciones de Java: la interfaz de conjunto .

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas