Red de conocimiento informático - Aprendizaje de programación - ¿Cuáles son las diferencias y conexiones entre Lista, Conjunto y Mapa?

¿Cuáles son las diferencias y conexiones entre Lista, Conjunto y Mapa?

1. La interfaz List simplemente extiende la Colección. Sus clases de implementación específicas se usan comúnmente como ArrayList y LinkedList.

Puedes poner cualquier cosa en un contenedor de Lista y sacarlo cuando sea necesario. ArrayList puede verse por su nombre que se almacena en forma de matriz, por lo que su velocidad de acceso aleatorio es extremadamente rápida, mientras que la implementación interna de LinkedList es una lista vinculada, que es adecuada para operaciones frecuentes de inserción y eliminación en el medio. de la lista enlazada. Puede elegir libremente según sus necesidades en aplicaciones específicas.

El Iterador mencionado anteriormente solo puede atravesar el contenedor hacia adelante, mientras que ListIterator hereda la idea de Iterador y proporciona un método para el recorrido bidireccional de la Lista.

2. La interfaz Set también es una extensión de Collection y, a diferencia de List, los elementos del objeto en Set no se pueden repetir, lo que significa que no se puede colocar lo mismo en el mismo Set dos veces. Sus implementaciones concretas de uso común incluyen las clases HashSet y TreeSet.

HashSet puede localizar rápidamente un elemento, pero el objeto que colocas en HashSet necesita implementar el método hashCode(), que utiliza el algoritmo de código hash mencionado anteriormente. TreeSet almacena los elementos colocados en él en orden, lo que requiere que los objetos que coloque en él se puedan ordenar. Esto utiliza las otras dos clases de utilidad Comparable y Comparador proporcionadas por el marco de la colección.

Si una clase se puede ordenar, debe implementar la interfaz Comparable. A veces, varias clases tienen el mismo algoritmo de clasificación, por lo que no es necesario definir repetidamente el mismo algoritmo de clasificación cada vez, siempre que se implemente la interfaz Comparator.

También hay dos clases públicas muy útiles en el marco de la colección: Colecciones y Arrays. Collections proporciona algunos métodos muy útiles para ordenar, copiar, buscar y llenar un contenedor de Collection, mientras que Arrays realiza operaciones similares en una matriz.

3. Map es un contenedor que asocia objetos clave y objetos de valor, y un objeto de valor puede ser un mapa, etc., formando así un mapeo multinivel.

Para objetos clave, como Set, no se permite repetir los objetos clave en un contenedor de mapa. Esto es para mantener la coherencia de los resultados de la búsqueda si hay dos objetos clave que son iguales. entonces desea obtener el objeto de valor correspondiente al objeto clave. Tal vez lo que obtenga no sea el objeto de valor que pensaba y el resultado será confuso. Por lo tanto, la unicidad de la clave es muy importante. y está en consonancia con la naturaleza del conjunto.

Por supuesto, durante el uso, el objeto de valor correspondiente a una determinada clave puede cambiar. En este caso, el último objeto de valor modificado corresponderá a la clave. No existe ningún requisito de unicidad para los objetos de valor. Puede asignar cualquier número de claves a un objeto de valor sin ningún problema (pero puede causarle inconvenientes porque no sabe qué objeto de valor corresponde a qué clave obtiene).

Map tiene dos implementaciones de uso común: HashMap y TreeMap. HashMap también utiliza el algoritmo de código hash para encontrar rápidamente una clave. TreeMap almacena las claves en orden, por lo que tiene algunos métodos extendidos, como firstKey(), lastKey(), etc. También puede usar TreeMap para especificar un rango para obtener su clave. submapa.

La asociación entre claves y valores es muy simple. Utilice el método pub(Clave de objeto, Valor de objeto) para asociar una clave con un objeto de valor.

Utilice get(Object key) para obtener el objeto de valor correspondiente a este objeto clave

Información ampliada:

Resolución de preguntas:

1.

p>

Algunas clases de colección proporcionan la función de recorrido de contenido a través de la interfaz java.util.Iterator. Estas interfaces permiten atravesar colecciones de objetos. Cada objeto elemento se manipula por turno. Cuando utilice iteradores, incluya una instantánea de la colección al obtener el iterador. Por lo general, no se recomienda modificar la colección al atravesar un iterador.

2. ¿Cuál es la diferencia entre Iterador y ListIterator?

Iterador: solo puede atravesar la colección en dirección hacia adelante, adecuado para obtener y eliminar elementos. ListIerator: hereda Iterator, puede atravesar la lista en ambas direcciones y también admite la modificación de elementos.

3. ¿Qué son HaspMap y Map?

Map es una interfaz, parte del marco de colección de Java, que se utiliza para almacenar pares clave-valor. HashMap es una clase que utiliza un algoritmo hash para implementar Map.

4. ¿Cuál es la diferencia entre HashMap y HashTable? Compare Hashtable VS HashMap

Ambos utilizan el método clave-valor para obtener datos. Hashtable es una de las clases de colección originales (también llamada clase heredada). HashMap se agregó en Java 2 versión 1.2 como parte del nuevo marco de colecciones. Existen las siguientes diferencias entre ellos:

● HashMap y Hashtable son aproximadamente equivalentes, excepto por la no sincronización y los valores nulos (HashMap permite valores nulos como clave y valor, pero Hashtable sí no).

● HashMap no puede garantizar que el orden de mapeo siempre permanecerá sin cambios, pero como subclase de HashMap, LinkedHashMap, si desea iterar en un orden predecible (el valor predeterminado es el orden de inserción), puede hacerlo fácilmente. reemplácelo con HashMap. No es tan fácil si usa Hashtable.

● HashMap no es sincrónico, pero Hashtable sí lo es.

● Iterative HashMap utiliza un mecanismo de fallo rápido, pero Hashtable no, por lo que esto es una consideración de diseño.

5. ¿Qué significa sincronización en el contexto de Hashtable?

La sincronización significa que solo un subproceso puede modificar la tabla hash en un momento determinado. Cualquier subproceso debe adquirir el bloqueo del objeto antes de realizar la operación de actualización de la tabla hash, y otros subprocesos esperan a que se libere el bloqueo.

6. ¿Cuál es la característica de falla rápida?

Desde un nivel alto, la falla rápida es la respuesta de un sistema o software a su falla. Un sistema de falla rápida está diseñado para informar de inmediato cualquier condición de falla que pueda resultar en una falla. Generalmente se usa para detener las operaciones normales en lugar de intentar continuar realizando un trabajo que puede ser defectuoso. Cuando ocurre un problema, el sistema a prueba de fallas emite alertas de error de manera inmediata y visible.

En Java, la falla rápida está asociada con iteradores. Si se crea un iterador en un objeto de colección y otros subprocesos quieren "estructurar" modificar el objeto de colección, se lanza una excepción de modificación concurrente (ConcurrentModificationException).

7. ¿Cómo sincronizar Hashmap?

HashMap puede lograr el efecto de sincronización a través de Map m = Collections.synchronizedMap (hashMap).

8. Cuándo usar Hashtable, cuándo usar HashMap

La diferencia básica es que Hashtable sincroniza HashMap, por lo que siempre que exista la posibilidad de que varios subprocesos accedan a la misma instancia, debes hacerlo. use Hashtable; de ​​lo contrario, use HashMap. Las estructuras de datos que no son seguras para subprocesos pueden generar un mejor rendimiento.

Si existe la posibilidad en el futuro de que necesite obtener pares clave-valor en orden, HashMap es una buena opción porque existe una subclase de HashMap, LinkedHashMap. Entonces, si desea iterar de manera predecible en orden (insertar orden de forma predeterminada), puede reemplazar fácilmente HashMap con LinkedHashMap.

Por otro lado, no es tan sencillo si se utiliza Hashtable. Al mismo tiempo, si varios subprocesos acceden a HashMap, se puede utilizar Collections.synchronizedMap() en su lugar. En general, HashMap es más flexible.

9. ¿Por qué la clase Vector se considera obsoleta o extraoficialmente no recomendada? O por qué siempre deberíamos usar ArrayList en lugar de Vector

Deberías usar ArrayList en lugar de Vector porque de forma predeterminada accedes de forma asincrónica, Vector sincroniza todos los métodos y casi nunca haces eso. A menudo lo que quieres sincronizar es toda una secuencia de operaciones. La sincronización de operaciones individuales tampoco es segura (si iteras sobre un Vector, aún debes bloquearlo para evitar que otros subprocesos cambien la colección al mismo tiempo).

Y la eficiencia es más lenta. Por supuesto, también existe la sobrecarga de bloquear incluso si no lo necesita, lo cual es una mala manera de sincronizar el acceso de forma predeterminada. Siempre puedes usar Collections.sychronizedList para decorar una colección.

De hecho, Vector combina una colección de "matrices mutables" con la implementación de la sincronización de cada operación. Este es otro defecto de diseño. Vector también tiene algunos métodos heredados en los métodos de enumeración y adquisición de elementos. Estos métodos son diferentes de la interfaz Lista. Si estos métodos se usan en el código, es más probable que los programadores quieran usarlos.

Aunque las enumeraciones son más rápidas, no pueden verificar si la colección se ha modificado durante la iteración, lo que puede causar problemas. A pesar de las razones anteriores, Oracle nunca ha anunciado que abandonará Vector.

Materiales de referencia:

Contenedor STLset - Enciclopedia Baidu

Interfaz de colección - Enciclopedia Baidu

lista (terminología informática) - —Enciclopedia Baidu