Vector y ArrayList y LinkedList diferencias y conexiones, así como los respectivos escenarios de aplicación
de seguridad hilo:
Vector: no especificado al crear la capacidad del vector, el tamaño predeterminado es de 10 y la implementación subyacente basada en la matriz, hilo de seguridad, se basan en métodos de sincronización sincronizadas plus cerradura
Agregar método
métodos de consulta
ArrayList: Sobre la base de la matriz subyacente,, consulta de alta eficiencia flujos seguros y modificar, añadir y eliminar pero baja eficiencia
Agregar método
método de consulta:
LinkedList: estructura subyacente doblemente enlazada lista, seguro para subprocesos, la baja eficiencia de la consulta y modificar, añadir y borrar pero de alta eficiencia
Agregar método
métodos de consulta
escenarios de uso:
1.Vector rara vez utilizan
2. Si necesita un gran número de adiciones y supresiones se pueden seleccionar ListaEnlazada
3. Si usted necesita una gran cantidad de consultas y modificar el ArrayList puede elegir
si quiere garantizar ArraList flujos seguros, hay varias maneras?
Tabla 1 a sí mismo escribir una clase de colección ArrayList, de acuerdo con el servicio en la cerradura, add / set / remove general
2 usando List <Object> list = Collections.synchronizedList ( new ArrayList <> ()); // uso de sincronizado de bloqueo
3 nuevo . CopyOnWriteArrayList <> add () ( ""); // usando bloqueo ReentrantLock
entender inferior CopyOnWriteArrayList? , CopyOnWriteArrayList y Collections.synchronizedList ¿Cuál es la diferencia
1 CopyOnWriteArrayList subyace aplicación:
modificación CopyOnWriteArrayList en la ejecución de la operación, se copie un nuevo conjunto de datos, costoso, y después de la modificación del punto de recogida original a la nueva colección para completar la operación
utilizando garantía ReentrantLock una colección de seguridad en un entorno multiproceso
Boolean la opción Agregar pública (E E) { Bloqueo final de ReentrantLock = this.lock; // Obtener una cerradura lock.lock (); // bloqueo el try { Object [] = getArray elementos (); // obtener la matriz de datos actuales , a elementos int len = elements.length; // grabar la longitud actual de la matriz Object [] newElements = Arrays.copyOf (elementos , LEN + 1); // copiar una nueva matriz newElements [len] = e; // voluntad entre los nuevos datos en la matriz setArray (newElements); // puntero a la matriz actual nuevos datos de retorno a la verdadera; } {el fin lock.unlock (); // Cierre de liberación } }
escenarios de aplicación CopyOnWriteArrayList: Para una operación de lectura es mucho mayor que el escenario de operación de escritura (No se encierre lectura, acceso directo subyacente)
2 más el Collections.synchronizedList casi todos los métodos subyacentes sincronizado bloqueo
Escena: escribir un mejor rendimiento que CopyOnWriteArrayList pero el rendimiento de lectura de CopyOnWriteArrayList
idea 4 CopyOnWriteArrayList es una especie de cómo, ¿cuáles son las desventajas?
Diseño: lectura y escritura por separado, con el tiempo consistentes
Contras: uso de la memoria, debido a la memoria de copia en escritura, habrá dos objetos espaciales, si el objeto es grande y propenso a YongGC FullGC
5 ArrayList mecanismo de expansión hablar es de la forma
1 .JDK1.8 tamaño predeterminado anterior es 10, la expansión jdk1.7 similar a 1,8, jdk1.6 1,5 veces +1
2.ArrayList tamaño del conjunto, si no se especifica cuando se crea, por defecto a 0, cuando el tamaño del conjunto se ha especificado, entonces el valor inicial de la especificada
de tiempo cuando los datos primero añadidos, la expansión es el tamaño del conjunto 10, cada uno de segunda y subsiguiente veces de acuerdo int oldCapacity = elementData.length; newCapacity = oldCapacity + (oldCapacity >> 1), es decir, 1,5 veces la de expansión
método para crear el tamaño ArrayList Ir ensureCapacityInternal () especifica cuando el pase en el pasado, si no se especifica el tamaño 0
La capacidad inicial predeterminada 10
Si la corriente juez sentencia dictada ArrayList está vacía, la asignación minCapacity, Math.max () y el juicio inicial especificada tan grande, lo puso asignado a minCapacity
A continuación, vaya método ensureExplicitCapacity ()
La determinación de si el número de pasada en ArrayList mayor que la longitud de la corriente, si es mayor que el producto de expansión, tomar Grow () método y pase minCapacity
La longitud de la colección asignado a oldCapacity (capacidad de edad)
newCapacity (nueva capacidad) es igual al valor de oldCapacity + (0,5 * Los valores oldCapacity)
Analizando newCapacity-minCapacity es menor que cero, será menor que si los valores asignados a newCapacity minCapacity
Analizando newCapacity-MAX_ARRAY_SIZE (capacidad máxima ajustada) es mayor que cero, será mayor que si hugeCapacity () devuelve el valor asignado a newCapacity
Una colección de original y volver a copiar a la capacidad asignada en la buena nueva serie de tareas asignadas a la colección original
El minCapacity hacer un juicio si es menor que cero, se informa de error de memoria insuficiente
La determinación de si minCapacity conjunto mayor que la capacidad máxima, si más que el valor máximo será devuelto en el pasado tipo Integer, es menor que la capacidad máxima del conjunto de recopilación volverá más allá de la capacidad máxima