ArrayList y Vector usan Array internamente como su estructura de datos. Sin embargo, existen pocas diferencias en la forma en que almacenan y procesan los datos. En esta publicación, discutiremos las diferencias y similitudes entre ArrayList y Vector.
ArrayList vs Vector:
1) Sincronización: ArrayList no está sincronizado, lo que significa que varios subprocesos pueden trabajar en ArrayList al mismo tiempo. Por ejemplo, si un subproceso está realizando una operación de adición en ArrayList, puede haber otro subproceso realizando una operación de eliminación en ArrayList al mismo tiempo en un entorno multiproceso
mientras Vector está sincronizado. Esto significa que si un hilo está funcionando en Vector, ningún otro hilo puede obtenerlo. A diferencia de ArrayList, solo un subproceso a la vez puede realizar una operación en el vector.
2) Cambiar tamaño: Tanto ArrayList como Vector pueden crecer y reducirse dinámicamente para mantener un uso óptimo del almacenamiento; sin embargo, la forma en que se escalan es diferente. ArrayList crece a la mitad de su tamaño cuando se escala, mientras que Vector duplica su tamaño de forma predeterminada cuando crece.
3) Actuación: ArrayList ofrece un mejor rendimiento ya que no está sincronizado. Las operaciones de vector ofrecen un rendimiento deficiente ya que son seguras para subprocesos, el subproceso que se ejecuta en Vector obtiene un bloqueo que hace que los otros subprocesos esperen hasta que se libere el bloqueo.
4) fallar rápidamente: Primero déjeme explicar qué es la falla rápida: si la colección (ArrayList, vector, etc.) se modifica estructuralmente por cualquier medio, excepto el agregar o eliminar métodos iterador, después de que se crea el iterador, el iterador se iniciará ConcurrentModificationException
. El cambio estructural se refiere a agregar o eliminar elementos de la colección.
De acuerdo a Vector javadoc la enumeración devuelta por Vector no es rápida. Por otro lado, el iterador y listIterator devueltos por ArrayList son rápidos.
5) ¿Quién pertenece realmente al marco de la colección? El vector no formaba parte del marco de la colección, se incluyó en las colecciones más tarde. Puede considerarse como código heredado. No hay nada en Vector que la colección List no pueda hacer. Por lo tanto, se debe evitar el Vector. Si se requiere una operación segura para subprocesos, sincronice ArrayList como se explica en la siguiente sección de esta publicación o use CopyOnWriteArrayList que es una variante segura para subprocesos de ArrayList.
Hay unos pocos similitudes entre estas clases que son las siguientes:
- Tanto Vector como ArrayList utilizan una estructura de datos de matriz expandible.
- El iterador y la lista de iteradores devueltos por estas clases (Vector y ArrayList) son rápidos.
- Ambas son clases de colección ordenadas ya que mantienen el orden en el que se insertan los elementos.
- Vector y ArrayList permiten valores duplicados y nulos.
- Ambos crecen y se encogen automáticamente cuando se produce el desbordamiento y la eliminación.
¿Cuándo usar ArrayList y cuándo usar vector?
Depende totalmente del requisito. Si necesita realizar una operación “segura para subprocesos”, vector es su mejor opción, ya que garantiza que solo un subproceso acceda a la colección a la vez.
Actuación: Las operaciones sincronizadas toman más tiempo que las operaciones no sincronizadas, por lo que si no necesita realizar operaciones seguras para subprocesos, ArrayList es una mejor opción ya que el rendimiento mejorará debido a los procesos concurrentes.
¿Cómo sincronizar ArrayList?
Como dije anteriormente, los métodos ArrayList no están sincronizados, pero de todos modos, si lo necesita, puede sincronizarlos de esta manera:
//Use Collecions.synzhonizedList method List list = Collections.synchronizedList(new ArrayList()); ... //If you wanna use iterator on the synchronized list, use it //like this. It should be in synchronized block. synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ... }