Habrá muchos objetos en el desarrollo real del proyecto. Java proporciona un marco de colección para resolver tales problemas. Las clases están en el paquete java.util, y la lista 1 describe la relación entre la clase de recolección.
Listado 1. La relación entre la clase de recopilación
Recopilación
├list
│├linkedlist
│LaArrayList
│orvector
│ Kstack
└ conjunto
Mapa
Bhashtable
Fashmap
Mada
Interfaz de colección
Interfaz de colección
La colección es la interfaz de colección más básica. Algunas colecciones permiten los mismos elementos y apoyan los elementos de clasificación, mientras que otras no funcionan. JDK no proporciona clases directamente heredadas de la colección. Todas las clases que implementan la interfaz de colección deben proporcionar dos constructores estándar. El último constructor permite a los usuarios copiar una colección.
¿Cómo iterar a través de cada elemento de la colección?
Independientemente del tipo real de colección, admite un método iterador (). El uso típico es el siguiente:
Iterator it = collection.iterator ();
Las dos interfaces de la interfaz de colección están listas y establecidas.
El método principal proporcionado por la interfaz de colección:
1. Boolean add (objeto o) Agregar objeto a la colección;
2. Boolean Eliminar (objeto o) Elimine el objeto especificado;
3. Int Size () Devuelve el número de elementos en la colección actual;
4. Boolean contiene (objeto o) Encuentre si hay objetos especificados en el conjunto;
5. boolean isEtimty () determinar si el conjunto está vacío;
6. Iterator Iterator () devuelve un iterador;
7. Boolean contiene todo (colección c) Encuentre si hay elementos en el conjunto C en el conjunto;
8. Boolean Addall (Collection C) agrega todos los elementos de la Collection C a la colección;
9. Nulo claro () Eliminar todos los elementos en el conjunto;
10. El retoque nulo (colección c) Elimine los elementos en el conjunto de colección C de la colección;
11. Vacío Reteneral (Colección C) Elimine el elemento que no incluye en la colección C de la colección.
Interfaz de lista
List es una colección ordenada que puede controlar con precisión la posición de cada elemento de inserción con esta interfaz. Los usuarios pueden usar índices (la posición de elementos en la lista, similar a la licitación de la matriz) para acceder a los elementos en la lista, que es similar a la matriz Java. A diferencia del conjunto que se mencionará a continuación, la lista permite los mismos elementos.
Además del método Iterator () que es necesario para la interfaz de recopilación, List también proporciona un método ListIterator () para devolver una interfaz Listotrator. En comparación con la interfaz de iterador estándar, Listotrator tiene algunos métodos como add (), lo que permite funciones como agregar, eliminar, establecer elementos, transversal hacia adelante o hacia atrás. Las clases de uso común para implementar las interfaces de la lista incluyen LinkedList, ArrayList, Vector y Stack.
El método principal proporcionado por la interfaz de la lista:
1. Void Add (int index, elemento de objeto) agrega un objeto en la ubicación especificada;
2. Boolean Addall (int Interns, Collection C) agrega el elemento del conjunto C a la posición especificada;
3. Object get (int index) Devuelve el elemento especificado en la posición designada en la lista;
4. IndexOf (Object o) Devuelve la posición del primer elemento O;
5. Objeto RemoutInt (int index) Elimine el elemento de la posición especificada;
6. Conjunto de objetos (int indexex, elemento de objeto) reemplace los elementos en el índice de posición del elemento elemento para devolver el elemento reemplazable.
Interfaz de mapa
El mapa no heredó la interfaz Colleg. El mapa proporciona una asignación de clave a valor. La interfaz de mapa proporciona 3 conjuntos de vistas.
El método principal proporcionado por el mapa:
1. Boolean iguales (objeto o) Objeto de comparación;
2. Boolean Eliminar (objeto o) Eliminar un objeto;
3. Ponga (clave de objeto, valor de objeto) Agregue la clave y el valor.
Interfaz RandomAccess
La interfaz RandomAccess es una interfaz de logotipo, que no proporciona ningún método en sí. El objetivo principal de esta interfaz es identificar la implementación de la lista que puede admitir un acceso rápido y aleatorio. Cualquier implementación de la lista basada en la matriz implementa la interfaz Raodomaccess, mientras que las implementaciones basadas en listas vinculadas no. Debido a que solo la matriz puede realizar un acceso aleatorio rápido, el acceso aleatorio a la lista vinculada debe ser atravesado por la lista vinculada. Por lo tanto, la ventaja de esta interfaz es que en la aplicación, puede saber si el objeto de lista que se está procesando puede realizar un acceso rápido y aleatorio, para realizar diferentes operaciones para diferentes listas para mejorar el rendimiento del programa.
Introducción
Clase de LinkedList
LinkedList implementa la interfaz de la lista y permite elementos nulos. Además, LinkedList proporciona Get, Eliminar, Insertar y otros métodos adicionales para operar datos en la primera o cola de LinkedList. Estas operaciones hacen que LinkedList se pueda usar como pilas, cola (cola) o colas de dos vías. Tenga en cuenta que LinkedList no tiene un método de sincronización. Una solución es construir una lista sincrónica al crear una lista.
List list = collections.synchronizedList (new LinkedList (...));
Clase ArrayList
ArrayList implementa una matriz de tamaño variable. Permite todos los elementos, incluido NULL. Tamaño, isEpty, Get, SET y otros métodos son el tiempo de ejecución, pero la sobrecarga de métodos ADD es la constante del intercambio.
Cada instancia de ArrayList tiene una capacidad (capacidad) para almacenar el tamaño de la matriz de elementos de almacenamiento. Cuando se necesita insertar una gran cantidad de elementos, puede llamar al método Ensurecapacity antes de insertar para aumentar la capacidad de ArrayList para mejorar la eficiencia de inserción. Al igual que LinkedList, ArrayList también es un hilo, no sincronizado (sincronizado).
El método principal proporcionado por ArrayList:
1. Boolean add (objeto o) agrega el elemento especificado al final de la lista;
2. Boolean add (int indexex, elemento objeto) para especificar la posición para agregar el elemento especificado en la lista;
3. Boolean Addall (Collection C) agrega el conjunto especificado al final de la lista;
4. Boolean addall (int interleg, colección c) Agregue una colección especificada en la ubicación especificada en la lista;
5. Boolean Clear () Eliminar todos los elementos de la lista;
6. Boolean Clone () Regrese a una copia de la lista de la lista;
7. Boolean contiene (objeto o) determinar si contiene elementos en la lista;
8. Boolean Ensurecapacidad (int m) aumenta la capacidad de la lista.
9. Object get (int index) devuelve el elemento especificado en la lista en la lista;
10. IndexOf (Object Elem) en la lista encuentra la oferta del elemento especificado;
11. Int Size () Devuelve el número de elementos de la lista actual.
Clase vectorial
El vector es muy similar a ArrayList, la diferencia es que el vector se sincroniza con hilos. El iterador creado por vector, aunque el iterador creado por ArrayList es el mismo puerto, porque el vector se sincroniza, cuando se creó y usó un iterador, el otro hilo cambió el estado de Vector (por ejemplo, agregando o eliminando algunos de los algunos de los algunos de los Elementos de estado), cuando se llama el método de iterador, se desechará la Excepción de Modificación Concurrente, por lo que se debe capturar la excepción.
Clase de pila
La pila heredó de Vector y se dio cuenta de una pila que posteriormente fue avanzada. La pila proporciona 5 métodos adicionales para que Vector se use como pilas. Además de los métodos básicos de empuje y POP, también existe el método PEEK para obtener el elemento de la parte superior de la pila. pila. Tenga en cuenta que después de que se acaba de crear Stack, era una pila vacía.
Clase establecida
SET es una colección sin elementos repetidos, es decir, cualquier dos elementos E1 y E2 tienen E1.Equals (e2) = falso. Hay un elemento nulo en la mayoría de los establecidos. Obviamente, el constructor del conjunto tiene una condición de restricción, y la entrada de los parámetros de colección no puede incluir elementos duplicados. Tenga en cuenta que debe operar cuidadosamente los objetos variables.
Clase hashtable
Hashtable hereda la interfaz MAP e implementa una tabla hash basada en el mapeo de valor clave. Cualquier objeto no nulo se puede usar como clave o valor. Agregue datos para usar PUT (clave, valor) y elimine los datos para usar (clave).
Hashtable ajusta el rendimiento a través de los dos parámetros de la capacidad inicial y el factor de carga. El factor de carga predeterminado 0.75 logra mejor el equilibrio de tiempo y espacio. El aumento del factor de carga puede ahorrar espacio, pero el tiempo de búsqueda correspondiente aumentará, lo que afectará las operaciones como Get and Put. Use el ejemplo simple de hashtable para poner los tres números de 1, 2 y 3 en la hashtable.
Lista 2. Ejemplo de hashtable
HASHTABLE NÚMEROS = new HashTable (); Numbers.put ("One", nuevo entero (1)); Numbers.put ("Two", New Integer (2)); Numbers.put ("Tres", nuevo entero (3 );
Si necesitamos sacar un número, como 2, podemos usar la clave correspondiente para sacarla, y el código se muestra en la lista 3.
Lista 3. Lea los datos de Hastable
Entero n = (entero) números.get ("dos");
Dado que el objeto de la clave se determinará calculando su función de distribución para determinar la posición del valor correspondiente, cualquier objeto como clave debe implementar los métodos hashcode y igual. Los métodos hashcode e iguales heredan el objeto raíz. = Verdadero, entonces su hásido debe ser el mismo, pero si los dos objetos son diferentes, su hásido no es necesariamente diferente. Método hashcode () que puede acelerar el funcionamiento de las tablas hash.
Si el mismo objeto tiene diferentes hashcode, habrá resultados inesperados para el funcionamiento de la tabla hash (esperando volver a nulo). en lugar de simplemente escribir uno de ellos.
Clase de hashmap
Hashmap es similar a la de hashtable. Sin embargo, cuando el hashmap se considera como la colección (se puede devolver el método de valores ()), es proporcional a la sobrecarga de tiempo suboperante iterativo y la capacidad de HASHMAP. Por lo tanto, si el rendimiento de la operación de iteración es muy importante, no establezca la capacidad de inicialización de HASHMAP demasiado alta, ni se establezca demasiado bajo en el parámetro del factor de carga.
Clase de Deakhashmap
Deakhashmap es un hashmap mejorado que "referencia débil" para la clave.
Práctica de clase de recolección
ArrayList, Vector y LinkedList se implementan desde AbstractList, y AbstractList implementa directamente la interfaz de la lista y se extiende desde AbStartCollection. ArrayList y Vector usan matrices para implementar. LinkedList utiliza una estructura de datos Circular de dos vías, que está conectada por una serie de elementos de la tabla.
Cuando la demanda de capacidad de ArrayList excede el tamaño de la matriz actual, debe ampliarse. Durante el proceso de expansión de capacidad, se realizará una gran cantidad de operaciones de replicación de matriz, y cuando se replica la matriz, finalmente se llamará al método System.ArrayCopy (). Dado que LinkedList usa la estructura de la lista vinculada, no necesita mantener el tamaño de la capacidad. Debido a la continuidad de la matriz, cuando el elemento siempre aumenta al final, la expansión de la matriz y la replicación de la matriz solo se pueden generar cuando el espacio es insuficiente.
ArrayList se basa en la matriz, y la matriz es un espacio de memoria continuo. LinkedList no disminuye el rendimiento debido a la inserción de datos.
Cada elemento efectivo de ArrayList debe reorganizarse después de eliminar las operaciones, y cuanto mayor sea el posicionamiento de la posición del elemento eliminado, mayor será la sobrecarga durante la reorganización de la matriz. LinkedList necesita eliminar los datos intermedios para la mitad de una lista.
Lista 4. Código de uso de ArrayList y LinkedList
Import java.util.ArrayList; = Nuevo objeto (); m. (); 0, obj2); 1000; i ++) {list1.Add (obj1);} end = System.CurrentTtimemillis (); System.CurrentTtimemillis (); ;}}
Lista 5. Ejecutar salida
639129669690015
Hashmap es para hacer el algoritmo de clave y luego asignar el valor de hash a la dirección de memoria para obtener directamente los datos correspondientes a la clave. En HASHMAP, la estructura de datos subyacente usa una matriz, la dirección de memoria que se llama SO es el índice de etiqueta de la matriz. El alto rendimiento de Hashmap requiere los siguientes puntos:
1. El algoritmo hash debe ser eficiente;
2. El algoritmo del valor hash para la dirección de memoria (índice de matriz) es rápido;
3. Según la dirección de memoria (índice de matriz), puede obtener directamente el valor correspondiente.
Hashmap es en realidad una matriz de una lista vinculada. Como se mencionó anteriormente, el mecanismo de implementación basado en el método de la lista vinculada basado en el hashmap, siempre que los métodos hashcode () y hash () se logren lo suficiente como para reducir la ocurrencia de conflicto tanto como sea posible, entonces la operación de hashmap Casi equivalente al acceso aleatorio a la matriz de matrices. Sin embargo, si el método hashcode () o hash () se logra mal, en el caso de una gran cantidad de conflictos, el hashmap en realidad se degrada en varias listas vinculadas, lo que es equivalente a la lista vinculada para la operación de HASHMAP. Esta vez, el rendimiento es muy pobre.
Una desventaja funcional de Hashmap es su desorden, que se almacena en los elementos en el hashmap. Si desea mantener el orden de entrada, puede usar LinkedHashMap en su lugar.
Linkedhashmap hereda del hashmap y tiene alta eficiencia.
Hashmap puede operar put () y obtener () tan rápido como el algoritmo hash. Treemap proporciona una implementación de mapa completamente diferente. En términos de función, Treemap tiene una característica más potente que HASHMAP. El rendimiento de Treemap es ligeramente más bajo que el hashmap. Si necesita ordenar los elementos en el desarrollo, no puede implementar esta función con HASHMAP. Linkedhashmap se basa en el orden de elemento que ingresa a la colección o al orden secuencial de acceder.
Linkedhashmap se clasifica de acuerdo con el orden de aumento o acceso de elementos, mientras que Treemap se clasifica de acuerdo con la clave del elemento.
El listado 6 muestra que el código demuestra el orden de la lógica comercial utilizando Treemap.
Listado 6. Treemap implementa la clasificación
Import java.util.iterator; nombre; (O.Score> this.score) {return -1;} return 0;} @OverridePublic String toString () {StringBuffer sb = new StringBuffer (); ; SB.Append (""); (); Estudiante s1 = nuevo estudiante ("1", 100); estudiante s2 = nuevo estudiante ("2", 99); estudiante s3 = nuevo estudiante ("3", 97); estudiante s4 = nuevo estudiante ("4 ", 91); map.put (S1, New StudentDetailinfo (S1)); map.put (S2, New StudentDetailinfo (S2)); Map.put (S3, New StudentDetailinfo (S3)); S4, New StudentDetailinfo (S4 )); / Imprima el mapa de puntajes MAP1 = (Treemap) .SubMap (S4, S2); next (); (S1); (Key));} System.out.println ("Subting end"); ;) {Estudiante clave = (estudiante) Itrator. (Student S) {this.s = s;}@oUnridepublic string toString () {return s.name + "la información detallada";}}
Lista 7. Ejecutar salida
Nombre: 4 Puntuación: 91-> 4 Nombre de información de detalle: 3 Puntuación: 97-> 3 Detalle InformationsUpMap EndName: 4 Puntuación: 91-> 4 Nombre de información de detalle: 3 Puntuación: 97-> 3 Nombre de información de detalle: 2 Puntuación: 99- > 2 Detalle InformationsubMap EndName: 1 Puntuación: 100-> 1 Detalle InformationsubMap Fin
Deakhashmap se caracteriza por sí mismo que si no hay otro Co en esta clave, excepto sus citas, entonces este mapa descartará automáticamente el valor. Como se muestra en el Listado 8, el código muestra dos objetos de mapa, uno es el hashmap, y el otro es débilhashmap. NULL, señalan a NULL. La razón de esta situación es que para el objeto A, cuando el hashmap se elimina y A para nula, además de débilhashmap, no hay un puntero a A excepto a, aunque apunta a nulo, hay un puntero apuntado a B en hashmap, tan débilhmap retendrá el objeto B.
Lista 8. Código de ejemplo de Weakhashmap
Import java.util.hashmap; String ("A"); , B, B, B, B, B, B, B, B, B, B, B, B, B, B, "BBB"); , "BBB"); .Entry en = (map.entry) izext (); . +En.getValue ());
Listado 9. Ejecutar salida
Mapa: B: Bbbweakmap: B: BBB
Deakhashmap logra principalmente el propósito de eliminar las entradas internas no utilizadas a través de ExpungestaleEntries, lo que alcanza el propósito de liberar automáticamente la memoria. Básicamente, siempre que se acceda al contenido de Deakhashmap, se llamará a esta función para lograr la entrada interna a la que ya no se hace referencia. Pero si te has convertido en un mapas de débil, y antes del GC, nunca has visitado el débilhashmap, ¿no es ilimitado liberar la memoria?
Lista 10. DeakhashMaptest1
Import java.util.ArrayList; ] [] >> maps = new ArrayList <Deakhashmap <byte [] [], byte [] [] >> (); byte [] []> d = new Deakhashmap <byte [] [], byte [] []> (); .add (d);
No cambie ningún parámetro JVM en la lista 10 que se muestre en la lista de operaciones.
Lista 11. Ejecutar salida
241242243Excetion in Thread "Main" java.lang.outofMemoryError: Java Heap Spaceat WeakhashMaptest1.Main (Weakhashmapst1.Java:10)
Efectivamente, Weakhashmap no liberó automáticamente la memoria innecesaria en este momento. El código que se muestra en el Listado 12 no tendrá un desbordamiento de memoria.
Lista 12. DeakhashMaptest2
Import java.util.ArrayList; ] [] >> maps = new ArrayList <Deakhashmap <byte [] [], byte [] [] >> (); byte [] []> d = new Deakhashmap <byte [] [], byte [] []> (); .add (d); .Get (j) .size ());}}}}
Los resultados de la operación encontraron que la salida de la prueba era normal y que el problema del desbordamiento de la memoria ya no se ocurrió.
En general, Weakhashmap no es un objeto que no se usa en el interior si hace algo, sino que libera el objeto interno no utilizado cuando accede a él.
Deakhashmap implementa referencias débiles porque su entrada <k, v> se hereda de la referencia de débil <K>.
En la definición de clase y el constructor de la entrada de Deakhashmap $ <k, V>, se muestra en la lista 13.
Lista 13. Definición de clase de Weakhashmap
Entrada de clase estática privada <k, v> extiende la referencia débil <k> implementa map.entry <k, v> entrada (k key, valor v, referencequeue <k> queue, int hash, entrada <k, v> next) {super (clave, cola);
Tenga en cuenta que construye una declaración de clase padre: "Super (clave, cola);"; En System.gc (), la matriz de bytes en la clave se recicla y el valor permanece (el valor está fuertemente asociado a la entrada, la entrada se asocia en MAP y MAP está asociado en ArrayList).
Cada vez que tengo un nuevo mapa débil cada vez, después de la operación de PUT, aunque el GC recicla la matriz de bytes en la clave de referencia débil y notifica al evento que referenceueue, no existe una acción correspondiente para activar el mapas de débil para manejar la referencia. La clave todavía existe en Weakhashmap, y su valor correspondiente también existe.
¿Cuándo se borrará el valor? ? Verifique el código fuente de WeakHashMap. Por lo tanto, el efecto es que la clave se eliminó cuando GC, y el valor visitó Weakhashmap después de que se despejó la clave.
La clase Deakhashmap no está sincronizada. Por lo tanto, ya sea dentro del mapeo o fuera del mapeo, la clave se elimina automáticamente solo después de que el recilador de basura elimina la referencia débil a una determinada clave. Cabe señalar que la atracción general mantiene el objeto Value en el Deakhashmap. Por lo tanto, debe tener cuidado de asegurarse de que el objeto de valor no haga referencia directa o indirectamente en sus propias claves, porque esto evitará que la tensión se descarte. Tenga en cuenta que el objeto de valor puede citar indirectamente la clave correspondiente a través del DeakhashMap en sí, lo que significa que un cierto objeto de valor puede estar fuertemente referenciado por otros objetos clave, y el objeto de valor asociado con el objeto clave gira al primero para hacer referencia al primero Uno.
Una forma de lidiar con este problema es empacar el valor en sí mismo en debilitaciones debilitadas antes de insertar, como: m.put (clave, nueva referencia (valor)), y luego usar la disección ". "El dispositivo de respaldo se falló rápidamente. Después de crear el dispositivo iterativo, si la asignación se modifica a partir de la estructura, a menos que el iterador propio elimine o agregue el método, los iteradores se modificarán en cualquier momento y de cualquier manera, y el iterador será Lanza la concurrencia de modificación concurrente. Por lo tanto, frente a la modificación de la concurrencia, el iterador falló rápidamente por completo, en lugar de arriesgarse en un comportamiento incierto arbitrario en cualquier momento en el futuro.
Tenga en cuenta que no podemos asegurar que el iterador falle.
Para resumir el código de introducción e instancia en el integral anterior, podemos saber que si involucra pilas, colas, etc., debemos considerar el uso de la lista. Para operaciones como la inserción rápida y la eliminación de elementos, se debe utilizar LinkedList. Si necesita acceder a elementos rápidamente, debe usar ArrayList. Si el programa se realiza en un entorno o acceso de un solo hilo o solo en un hilo, considerando clases no sincronizadas, es eficiente. Si varios subprocesos pueden operar una clase al mismo tiempo, se debe usar la clase sincrónica. Preste especial atención a la operación de la tabla hash, y el objeto de los iguales y el hashcode como clave es escribir correctamente los métodos iguales y hashcode. Intente devolver la interfaz en lugar de los tipos reales, como la lista de devolución en lugar de ArrayList, de modo que si ArrayList debe ser reemplazado por LinkedList en el futuro, el código del cliente no necesita cambiar.
Este artículo es solo para compartir el nivel de aplicación.