Parece que cuando se programa en Java que no se supone que debemos utilizar vectores más cuando se trata de temas.
Es necesario comprender por qué usando Vector
se considera que es una mala cosa en la mayoría de los contextos. Las razones son:
Vector
sincroniza en cada operación. La mayoría de los contextos no requieren una sincronización precisa, y como tal es una sobrecarga de rendimiento no deseada.
El método Vector.elements()
devuelve Enumeration
que no tiene una semántica a prueba de fallos.
Devolviendo esto a su pregunta. Las alternativas dependen de lo que los hilos están tratando de hacer:
Si el caso de uso no requiere la sincronización en absoluto, usar ArrayList
, o LinkedList
. Normalmente los usará si:
- La lista está restringida por hilos; es decir, solo un hilo puede acceder a él.
- La lista requiere sincronización de grano grueso; es decir, acceso exclusivo mientras se realiza una secuencia de operaciones. En este caso, normalmente crearía una clase personalizada con un
ArrayList
incrustado (por ejemplo) que no está expuesto en la API de clases personalizadas.
Si el caso de uso requiere la sincronización de grano fino, Collections.synchronizedList
envoltura es equivalente a una Vector
. Alternativamente, puede quedarse con Vector
y evitar el uso de la operación elements()
.
Una lista de CopyOnWriteArrayList
tiene la ventaja de que su iterador admite modificaciones simultáneas ... en cierto sentido. También se escala mejor si su aplicación realiza principalmente leer la lista. Las operaciones de lectura no necesitan sincronizarse explícitamente, y generalmente solo necesitan leer un solo volatile
una vez. Pero la otra cara de la moneda es que las operaciones de escritura se sincronizan y son significativamente más caras que las ArrayList
"normales".
El otro problema con Vector
y la Collections.synchronizedList
envoltura es que algunos casos de uso requieren sincronización gruesa; p.ej. probar el tamaño de una lista y agregar condicionalmente un elemento en una sola operación sincronizada. Las clases Queue
y Deque
proporcionan abstracciones de mayor nivel que se ocupan de este tipo de cosas ... para los casos de uso que implican pasar trabajo de forma asincrónica de un hilo a otro.
La conclusión es que no hay una talla única para toda la solución. Debe comprender las características de simultaneidad del diseño de su aplicación y elegir las estructuras de datos correspondientes.
Por último, si se está programando para Java ME, puede ser atrapado con el uso de Vector
, dependiendo de lo que J2ME perfil que está apuntando.
Este es un reemplazo de complemento más o menos para 'Vector'. Pero no es necesariamente lo correcto para usar. –
Gracias. Tendré que convertir algunos de mis vectores a listas. – VSH3R