Las diferencias y conexiones entre las cinco clases de colección más utilizadas en Java
Hay varias clases de colección de uso común:
Clases de colección de estructura de lista: clase ArrayList, clase LinkedList, clase Vector, clase Stack
Clase de colección de estructura de mapa : Clase HashMap, clase Hashtable
Clase de colección de estructura Set: clase HashSet, clase TreeSet
Colección de estructura de cola: interfaz de cola
HashMap y Hashtable La diferencia :
HashMap y Hashtable son clases de colección de Java y se pueden usar para almacenar objetos Java. Ésta es su similitud.
Las siguientes son sus diferencias:
1. Razones históricas:
Hashtable se basa en la antigua clase Diccionario y HashMap es una realidad de la interfaz Map introducida en Java 1.2.
2. Sincronicidad:
Hashtable es sincrónico. Algunos métodos de esta clase garantizan que los objetos en Hashtable sean seguros para subprocesos, mientras que HashMap es asíncrono, por lo que los objetos de HashMap no lo son. Seguro para subprocesos, porque los requisitos de sincronización afectarán la eficiencia de la ejecución, por lo que si no necesita una combinación segura para subprocesos, usar HashMap es una buena opción para evitar el rendimiento innecesario causado por la sincronización. Para reducir la sobrecarga y mejorar la eficiencia, los programas. Generalmente escribimos son asíncronos, excepto el código del lado del servidor.
3. Valor:
HashMap te permite usar valores nulos como clave o valor de una entrada de tabla.
Hashtable no puede poner valores nulos. (nulo)
La diferencia entre ArrayList y Vector:
ArrayList y Vector son clases de colección de Java, ambas utilizadas para almacenar objetos Java. Esta es su similitud,
<. p>Diferencia:1. Sincronicidad:
Vector está sincronizado. Algunos métodos de esta clase garantizan la seguridad de los subprocesos de los objetos en Vector, mientras que ArrayList es asincrónico, por lo que los objetos en ArrayList no es seguro para subprocesos porque los requisitos de sincronización afectarán la eficiencia de la ejecución, por lo que si no necesita una colección segura para subprocesos, usar ArrayList es una buena opción para evitar inconsistencias causadas por la sobrecarga de rendimiento necesaria. .
2. Crecimiento de datos:
En términos de mecanismos de implementación internos, tanto ArrayList como Vector usan matrices (Array) para controlar objetos en la colección cuando agregan dos tipos. elementos, si el número de elementos excede la longitud actual de la matriz interna, todos deben extender la longitud de la matriz interna. Vector aumenta automáticamente la longitud de la matriz al doble de la longitud original de forma predeterminada. ArrayList es el 50 original. Al final obtienes El espacio ocupado por esta colección siempre es mayor de lo que realmente necesitas, por lo que si vas a guardar una gran cantidad de datos en la colección, existen algunas ventajas al usar Vector, porque puedes evitar errores innecesarios configurando el Tamaño inicial de la colección.
Resumen:
1) Si se requiere seguridad para subprocesos, use Vector, Hashtable
2) Si no se requiere seguridad para subprocesos, use ArrayList, LinkedList, HashMap p>
3) Si se requieren pares clave-valor, use HashMap, Hashtable
4) Si la cantidad de datos es grande, se requiere seguridad de subprocesos para considerar Vector
1. ArrayList: elemento único, alta eficiencia, utilizado principalmente para consultas
2. Vector: elemento único, seguro para subprocesos, utilizado principalmente para consultas
3. LinkedList: elemento único, utilizado principalmente para inserción y eliminación
4. HashMap: los elementos están en pares y los elementos pueden estar vacíos
5. HashTable: los elementos están en pares, son seguros para subprocesos, los elementos no pueden estar vacíos
ArrayList
La capa inferior es una matriz de objetos, por lo que ArrayList tiene la ventaja de una velocidad de consulta de matriz rápida y la desventaja de la velocidad lenta de adición y eliminación.
La capa inferior de LinkedList es una lista enlazada circular de dos vías. Cada nodo de datos en esta lista vinculada consta de tres partes: puntero frontal (que apunta a la posición del nodo anterior), datos y puntero posterior (que apunta a la posición del nodo siguiente). El puntero posterior del último nodo apunta al puntero frontal del primer nodo, formando un bucle.
La eficiencia de consulta de la lista enlazada circular bidireccional es baja pero la eficiencia de adición y eliminación es alta.
No hay diferencia en el uso entre ArrayList y LinkedList, pero aún existen diferencias en la funcionalidad.
LinkedList
Se suele utilizar en situaciones en las que hay muchas adiciones y eliminaciones pero pocas operaciones de consulta: colas y pilas.
Cola: estructura de datos primero en entrar, primero en salir.
Stack: Estructura de datos último en entrar, primero en salir.
Nota: Cuando utilice la pila, no debe proporcionar un método que permita que elementos que no sean el último elemento tengan la oportunidad de salir de la pila.
Vector
(Similar a ArrayList, la diferencia es que Vector es un componente pesado que consume más recursos).
Conclusión: al considerar la concurrencia en este En este caso, utilice Vector (para garantizar la seguridad del hilo).
Utilice ArrayList sin considerar la concurrencia (no se puede garantizar la seguridad de los subprocesos).
Experiencia de entrevista (puntos de conocimiento):
La clase principal de java.util.stack (la pila es la pila) es Vector. Pero la clase principal de la pila no debería ser Vector. Porque la capa subyacente de Vector es una matriz y Vector tiene un método get (lo que significa que puede acceder a otros elementos que no pertenecen al último elemento de posición, lo cual es muy inseguro).
Para pilas y colas, solo se pueden usar clases push y get.
No utilices la clase Stack a la ligera en el futuro.
Se debe utilizar LinkedList para implementar la pila.
(En JAVA1.5, la colección tiene una cola para implementar la cola).
Clase de implementación Set-HashSet:
Solo hay un método para atravesar un conjunto. : Iterador.
Los elementos en HashSet están desordenados (este desorden significa que el orden en que se agregan los datos es diferente del orden en que se organizan posteriormente) y los elementos no son repetibles.
Además de finalize(), toString(), equals(), también existe hashCode() en Object.
La capa inferior de HashSet también utiliza matrices.
Al agregar un objeto a la matriz usando add(Object o), el sistema primero encuentra el código hash del objeto:
int hc=o.hashCode(); es un valor entero.
Int I=hcn; (n es la longitud de la matriz). Después de obtener el resto, use el resto para agregar datos a la posición correspondiente en la matriz. I=0, colóquelo en la posición a[0], si I=1, colóquelo en la posición a[1] de la matriz. Si el valor devuelto por equals() es verdadero, los datos se duplican. Si el valor devuelto por igual () es falso, busque otras ubicaciones para comparar. Este mecanismo hace posible que dos objetos idénticos se agreguen a la matriz repetidamente porque su código hash es diferente.
Si podemos hacer que dos objetos idénticos tengan el mismo código hash, equals() puede devolver verdadero.
En la instancia, anule su código hash al definir el objeto de estudiante.
Debido a que la clase String se sobrescribe automáticamente, al comparar objetos de la clase String, no habrá dos objetos de cadena idénticos.
Ahora, en la mayoría de los JDK, es necesario anular el código hash.
Conclusión: si usa hashSet para agregar objetos a una clase personalizada, debe anular hashcode() y equals(). El principio de sobrescritura es garantizar que el código hash de dos objetos devuelva el mismo número entero. y es igual () El valor de retorno es Verdadero.
Si eres vago y no configuras equals(), el código hash devuelto tendrá el mismo resultado, pero se llamará a equals() varias veces durante la ejecución del programa, lo que afectará la eficiencia del programa. ejecución.