metodos - Colecciones Java que mantienen el orden de inserción
java collections framework español (10)
¿Por qué es necesario mantener el orden de inserción? Si usa HashMap
, puede obtener la entrada por key
. No significa que no proporciona clases que hacen lo que quieres.
¿Por qué algunas estructuras de datos de colección no mantienen el orden de inserción? ¿Qué es lo especial logrado en comparación con mantener el orden de inserción? ¿Ganamos algo si no mantenemos el orden?
Actuación. Si desea el orden de inserción original, existen las clases LinkedXXX, que mantienen una lista vinculada adicional en orden de inserción. La mayoría de las veces no te importa, entonces usas un HashXXX, o quieres un orden natural, entonces usas TreeXXX. En cualquiera de esos casos, ¿por qué debería pagar el costo adicional de la lista vinculada?
Cuando utiliza un HashSet (o un HashMap) los datos se almacenan en "cubos" basados en el hash de su objeto. De esta forma, es más fácil acceder a sus datos porque no tiene que buscar estos datos en particular en todo el conjunto, solo tiene que buscar en el cubo correcto.
De esta forma puedes aumentar el rendimiento en puntos específicos.
Cada implementación de Colección tiene su particularidad para mejorar su uso en una determinada condición. Cada una de esas particularidades tiene un costo. Entonces, si realmente no lo necesita (por ejemplo, el orden de inserción), es mejor que utilice una implementación que no lo ofrece y que se ajusta mejor a sus requisitos.
De acuerdo ... entonces estas publicaciones son antiguas en comparación con ahora, pero el pedido de inserción es necesario según su necesidad o los requisitos de la aplicación, así que solo use el tipo correcto de colección. En su mayor parte, no es necesario, pero en una situación en la que necesita utilizar objetos en el orden en que fueron almacenados, veo una necesidad definitiva. Creo que el orden importa cuando estás creando, por ejemplo, un asistente o un motor de flujo o algo de esa naturaleza en el que tienes que ir de un estado a otro o algo así. En ese sentido, puede leer cosas de la lista sin tener que hacer un seguimiento de lo que necesita a continuación o recorrer una lista para encontrar lo que desea. Ayuda con el rendimiento en ese sentido. Importa o de lo contrario estas colecciones no tendrían mucho sentido.
Depende de lo que necesita la implementación para hacer bien. Por lo general, el orden de inserción no es interesante, por lo que no es necesario mantenerlo para que pueda reorganizarlo para obtener un mejor rendimiento.
En el caso de Maps, generalmente se usa HashMap y TreeMap. Mediante el uso de códigos hash, las entradas se pueden poner en pequeños grupos fáciles de buscar. TreeMap mantiene un orden ordenado de las entradas insertadas a costa de una búsqueda más lenta, pero más fácil de ordenar que un HashMap.
Hay una sección en el Recetario de Java de O''Reilly llamada "Evitar el impulso de ordenar". La pregunta que debería hacerse es, en realidad, la contraria a su pregunta original ... "¿Ganamos algo clasificando?" Se requiere un gran esfuerzo para ordenar y mantener ese orden. La clasificación segura es fácil, pero generalmente no se escala en la mayoría de los programas. Si va a manejar miles o decenas de miles de solicitudes (insrt, del, get, etc.) por segundo, ya sea que esté utilizando una estructura de datos clasificada o no, va a ser importante.
Las colecciones no mantienen el orden de inserción. Algunos solo predeterminan agregar un nuevo valor al final. Mantener el orden de inserción solo es útil si le da prioridad a los objetos o los usa para ordenar objetos de alguna manera.
En cuanto a por qué algunas colecciones lo mantienen por defecto y otros no, esto es principalmente causado por la implementación y solo algunas veces parte de la definición de colecciones.
Las listas mantienen el orden de inserción, ya que simplemente agregar una nueva entrada al final o al principio es la implementación más rápida del método de agregar (objeto).
Conjuntos Las implementaciones HashSet y TreeSet no mantienen el orden de inserción ya que los objetos se ordenan para una búsqueda rápida y el mantenimiento del orden de inserción requeriría memoria adicional. Esto resulta en una ganancia de rendimiento ya que el orden de inserción casi nunca es interesante para Sets.
ArrayDeque se puede utilizar un deque para la cola simple y la pila, por lo que debe tener el comportamiento de "primero en entrar, primero en salir" o "primero en salir de nuevo"; ambos requieren que ArrayDeque mantenga el orden de inserción. En este caso, el orden de inserción se mantiene como una parte central del contrato de clases.
No puedo citar una referencia, pero por diseño, las implementaciones de List
y Set
de la interfaz de Collection
son básicamente Array
s extensibles. Como las Collections
de manera predeterminada ofrecen métodos para agregar y eliminar elementos dinámicamente en cualquier punto, lo que Array
no hace, el orden de inserción podría no conservarse. Por lo tanto, como hay más métodos para la manipulación de contenido, existe una necesidad de implementaciones especiales que mantengan el orden.
Otro punto es el rendimiento, ya que la Collection
que mejor se desempeña podría no ser eso, lo que preserva su orden de inserción. Sin embargo, no estoy seguro de cómo exactamente las Collections
administran su contenido para aumentar el rendimiento.
Entonces, en resumen, las dos principales razones por las que puedo pensar en por qué hay implementaciones de Collection
preservan el orden son:
- Arquitectura de clase
- Actuación
algunas colecciones no mantienen el orden debido a que calculan el hashCode del contenido y lo almacenan en consecuencia en el depósito correspondiente.
- El orden de inserción no se mantiene inherentemente en las tablas hash ; así es como funcionan (lea el artículo vinculado para comprender los detalles). Es posible agregar lógica para mantener el orden de inserción (como en
LinkedHashMap
), pero eso requiere más código, y en el tiempo de ejecución más memoria y más tiempo. La pérdida de rendimiento generalmente no es significativa, pero puede ser. - Para
TreeSet/Map
, la razón principal para usarlos es el orden de iteración natural y otras funcionalidades agregadas en la interfazSortedSet/Map
.