Tanto ArrayList como Vector utilizan Array como estructura de datos internamente. Sin embargo, hay pocas diferencias en la forma en que almacenan y procesan los datos. En este post discutiremos las diferencias y similitudes entre ArrayList y Vector.
1) Sincronización: ArrayList no está sincronizado, lo que significa que múltiples hilos pueden trabajar en ArrayList al mismo tiempo. Por ejemplo, si un hilo está realizando una operación de adición en ArrayList, puede haber otro hilo que realice una operación de eliminación en ArrayList al mismo tiempo en un entorno multihilo.
mientras que el Vector está sincronizado. Esto significa que si un hilo está trabajando en Vector, ningún otro hilo puede hacerse con él. A diferencia de ArrayList, sólo un hilo puede realizar una operación en Vector a la vez.
2) Cambiar el tamaño: Tanto ArrayList como Vector pueden crecer y encoger dinámicamente para mantener el uso óptimo del almacenamiento, sin embargo la forma en que se redimensionan es diferente. ArrayList crece a la mitad de su tamaño cuando se redimensiona, mientras que Vector dobla su tamaño por defecto cuando crece.
3) Rendimiento: ArrayList ofrece un mejor rendimiento ya que no está sincronizado. Las operaciones de Vector dan un pobre rendimiento ya que son seguras para el hilo, el hilo que funciona en Vector se bloquea en él, lo que hace que el otro hilo espere hasta que se libere el bloqueo.
4) Falla-rápida: Primero déjame explicarte qué es el fail-fast: Si la colección (ArrayList, vector, etc.) se modifica estructuralmente por cualquier medio, excepto por los métodos de añadir o quitar del iterador, después de la creación del iterador, éste lanzará ConcurrentModificationException. La modificación estructural se refiere a la adición o eliminación de elementos de la colección.
Según el javadoc de Vector la Enumeración devuelta por Vector no es rápida. Por otro lado, el iterador y el listador devueltos por ArrayList son rápidos.
5) ¿Quién pertenece realmente al marco de la colección? El vector no era parte del marco de la colección, ha sido incluido en las colecciones más tarde. Puede ser considerado como código Legacy. No hay nada en el Vector que la colección de la Lista no pueda hacer. Por lo tanto el Vector debe ser evitado. Si hay una necesidad de operación a prueba de hilos, haz que ArrayList esté sincronizado como se discute en la siguiente sección de este post o usa CopyOnWriteArrayList que es una variante a prueba de hilos de ArrayList.
Hay pocas similitudes entre estas clases que son las siguientes:
- Tanto Vector como ArrayList utilizan una estructura de datos de matriz creciente.
- El iterador y el listador devueltos por estas clases (Vector y ArrayList) son rápidos.
- Ambos son clases de colección ordenadas, ya que mantienen el orden de inserción de los elementos.
- Vector y ArrayList permiten valores duplicados y nulos.
- Ambas crecen y se encogen automáticamente cuando se desborda y se borra.
¿Cuándo usar ArrayList y cuándo usar vector?
Depende totalmente del requisito. Si es necesario realizar una operación «a prueba de hilos», el vector es la mejor opción, ya que asegura que sólo un hilo acceda a la colección a la vez.
Rendimiento: Las operaciones sincronizadas consumen más tiempo en comparación con las no sincronizadas, por lo que si no hay necesidad de realizar una operación «thread-safe», el ArrayList es una mejor opción, ya que el rendimiento mejorará gracias a los procesos concurrentes.
¿Cómo hacer que ArrayList esté sincronizado?
Como he dicho antes, los métodos ArrayList no están sincronizados, pero aún así, si es necesario, se pueden sincronizar de esta manera.
//Utilizar Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//Si quieres usar el iterador en la lista sincronizada, úsalo// así. Debe estar en sincronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}