Hola, estoy mirando las montañas.
Este artículo todavía está lanzando sobre las colas en Java. La última vez que comparé Vector, ArrayList, CopyOnWriteArrayList, SynchronizedList , me sentí bastante claro en ese momento, pero no lo entendí después de pensarlo, así que hoy lo resolví y lo estudié de nuevo. Admito que me quedé atascado. Arriba.
Vector
Aunque hay varios problemas, todos son problemas de diseño, ¿por qué no optimizar en versiones posteriores? HashMap
Se ha optimizado varias veces. Y SynchronizedList
esta clase interna (es decir, Collections.synchronizedList(new ArrayList())
creada) también usa un Vector
método de sincronización similar (la diferencia es una en el cuerpo del método y la otra en el bloque del método, la diferencia no es grande), ¿por qué aún lo abandonas Vector
?
De hecho, en el JDK Vector
no se ha marcado como Deprecated
, es decir, aunque Vector
hay varios problemas en el mundo exterior , pero desde el funcionario del JDK, nunca ha considerado inútil a este hijo.
Por lo tanto, Vector
solo hay dos razones por las que no lo usa :
- Otras colas son
Vector
más adecuadas que las mejores - Todo el mundo dice que
Vector
no es fácil de usar, entonces ya no lo necesito [personalmente creo que esta probabilidad es mayor]
Debido a que es
Vector
principalmente una estructura de matriz, la mayoría de las siguientes comparaciones son paraArrayList
empaquetamiento síncrono.
Con Vector
porque haySynchronizedList
La respuesta a esta pregunta se encuentra en StackOverflow.
Antes de JDK 1.2, Collections
era una biblioteca de clases independiente, no parte de JDK / JRE. El synchronized
rendimiento era particularmente pobre en ese momento y muchos escenarios no necesitaban usar sincronización, por lo que los desarrolladores de la biblioteca de clases independientes eliminaron la operación de sincronización, que debería ser ArrayList
la predecesora. Sin embargo, una pequeña cantidad de escenarios todavía necesitan usar la sincronización, por lo que existe una clase contenedora que SynchronizedList
puede envolver todas las List
subclases. Esta clase agrega synchronized
sincronización a casi todos los métodos. Este diseño es Vector
similar.
Los antiguos decían que "los literatos son más ligeros", de hecho, hay una cadena de desprecio en el mundo de la codificación. Aquí está: Aunque mi diseño es similar al tuyo, mi diseño es mejor que el tuyo. Sin embargo, el Collections
diseño es realmente mejor.
Uno SynchronizedList
para toda la List
sincronización
SynchronizedList
El posicionamiento es una categoría de empaque, que puede empaquetar todas las List
subcategorías. Es decir, no importa si está ArrayList
o LinkedList
puede sincronizarse, la estructura de datos subyacente no se modificará en absoluto, lo que no solo logra la sincronización, sino que también conserva las ventajas de la interfaz subyacente. Por ejemplo LinkedList
, la eficiencia de inserción y eliminación ArrayList
y lectura secuencial. Además, una clase contenedora puede resolver List
los requisitos de sincronización de todas las subclases y no es necesario repetir la implementación en absoluto.
En términos relativos, Vector
es más dominante: cualquier cola que desee sincronizar debe convertirse en Vector
una estructura de matriz. Todo el mundo sabe que el almacenamiento de arreglos requiere espacio continuo y la eficiencia de lectura secuencial es excelente, pero la eficiencia de inserción y eliminación es relativamente baja.
Entregar los derechos de sincronización del iterador al usuario.
El método de sincronización SynchronizedList
y Vector
es muy similar, pero el método del iterador tiene una idea diferente.
Ver el código fuente de conocimientos, SynchronizedList
en iterator
y listIterator
no están sincronizados métodos, por lo que no quede bloqueado en el tiempo iterador.
public Iterator<E> iterator() {
return list.iterator(); // Must be manually synched by user!
}
public ListIterator<E> listIterator() {
return list.listIterator(); // Must be manually synched by user
}
public ListIterator<E> listIterator(int index) {
return list.listIterator(index); // Must be manually synched by user
}
Si necesita iterar, simplemente synchronized
envuelva el objeto de cola directamente , el código es el siguiente:
final List<String> list = Collections.synchronizedList(new ArrayList());
list.add("A");
list.add("B");
list.add("C");
final Iterator<String> iterator = list.iterator();
synchronized (list) {
while (iterator.hasNext()) {
final String next = iterator.next();
System.out.println(next);
}
}
Veamos la Vector
implementación del iterador:
/**
* An optimized version of AbstractList.Itr
*/
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
// Racy but within spec, since modifications are checked
// within or after synchronization in next/previous
return cursor != elementCount;
}
public E next() {
synchronized (Vector.this) {
checkForComodification();
int i = cursor;
if (i >= elementCount)
throw new NoSuchElementException();
cursor = i + 1;
return elementData(lastRet = i);
}
}
public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
synchronized (Vector.this) {
checkForComodification();
Vector.this.remove(lastRet);
expectedModCount = modCount;
}
cursor = lastRet;
lastRet = -1;
}
// 此处省略一些方法
}
Vector
El iterador de se usa para synchronized (Vector.this)
bloquear, de hecho, también es para bloquear la instancia de clase actual, que es consistente con el método de bloqueo implementado por nosotros mismos. Por supuesto, desde este punto de vista Vector
, también es Vector
una ventaja garantizar que los errores causados por la sincronización se puedan evitar sin que el desarrollador se dé cuenta .
Vector
No del todo inútil
Aunque Vector
perdió en otros lugares Collections
, todavía hay otro mérito en términos de expansión de capacidad. Primero mira Vector
el método de expansión:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
Al calcular la longitud de la nueva matriz, verificará capacityIncrement
si es mayor que 0 y, si lo es, expandirá capacityIncrement
el tamaño. En otras palabras, el Vector
tamaño de expansión se puede especificar en. Si no se especifica, la expansión se duplicará de forma predeterminada, pero ArrayList
solo se puede expandir a 1,5 veces y no hay forma de personalizar el tamaño de expansión.
Si lo piensas bien, esto no sirve de nada.
Resumen al final del artículo
Vector
La estructura interna es una matriz yCollections.synchronizedList(new ArrayList())
similar.Vector
Puede especificar el tamaño de expansión, y el valor predeterminado es expandir al doble de la longitud de la matriz original; noArrayList
puede especificar el tamaño de expansión y expandir directamente a 1,5 veces el tamaño de la matriz original.SynchronizedList
Es una clase de empaquetado que puede envolver todas las subclasesList
en una cola síncrona, desde una cola no segura para subprocesos hasta una cola segura para subprocesos, sin demora en el rendimiento, simplemente envuélvala directamente;Vector
es una cola síncrona basada en matrices, y otras las colas a las que se desea convertirVector
, se requiere copia de datos.SynchronizedList
El iterador de no está sincronizado y debe ser implementadoVector
por el usuario; el iterador de está sincronizado y los desarrolladores no necesitan preocuparse por la sincronización.Vector
Hasta ahora no está marcadoDeprecated
y, con el lanzamiento del JDK, la implementación también se está actualizando. Aunque el JDK promete ser compatible, no se ha marcado como caducado y se desconoce su intención.
Lectura recomendada
- Conozca las colas en Java: Vector, ArrayList, CopyOnWriteArrayList, SynchronizedList
- ¿Qué sucede si tiene que usar ArrayList en varios subprocesos?
- ¿Por qué la clase Java Vector (y Stack) se considera obsoleta o en desuso?
- En java, Vector y Collections.synchronizedList están todos sincronizados, ¿cuál es la diferencia?
Hola, estoy mirando la montaña, la cuenta pública: mirando la cabaña de la montaña, un simio de 10 años, Apache Storm, WxJava, colaborador de código abierto de Cynomys. Nada en el mundo de los códigos, disfruta de la vida en el drama.
Página de inicio personal: https://www.howardliu.cn
Publicación de blog personal: La diferencia entre Vector y Collections.synchronizedList (nueva ArrayList ()) en la
página de inicio de Java CSDN: http://blog.csdn.net/liuxinghao
Publicación de blog de CSDN: Vector en Java La diferencia con Collections.synchronizedList (new ArrayList ())