Diferencia entre ArrayList y Vector En java
ArrayList y 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.
ArrayList Vs Vector:
1) Sincronización: ArrayList no está sincronizada, lo que significa que varios hilos pueden funcionar en ArrayList al mismo tiempo. Por ej. si un subproceso realiza una operación de adición en ArrayList, puede haber otro subproceso que realice una operación de eliminación en ArrayList al mismo tiempo en un entorno de varios subprocesos
mientras el vector está sincronizado. Esto significa que si un hilo está trabajando en Vector, ningún otro hilo puede obtenerlo. A diferencia de ArrayList, solo un hilo puede realizar una operación en vector a la vez.
2) Redimensionar: Tanto ArrayList como Vector pueden crecer y reducirse 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 cambia de tamaño, mientras que Vector duplica el tamaño de sí mismo por defecto cuando crece.
3) Rendimiento: ArrayList ofrece un mejor rendimiento, ya que no está sincronizado. Las operaciones vectoriales ofrecen un rendimiento deficiente, ya que son seguras para el hilo, el hilo que funciona en el vector recibe un bloqueo que hace que el otro hilo espere hasta que se libere el bloqueo.
4) fail-fast: Primero déjame explicar qué es fail-fast: Si la colección (ArrayList, vector, etc.) se modifica estructuralmente por cualquier medio, excepto los métodos add o remove de iterator, después de la creación de iterator, el iterador lanzará ConcurrentModificationException
. La modificación estructural se refiere a la adición o eliminación de elementos de la colección.
De acuerdo con el vector javadoc, la Enumeración devuelta por Vector no es fail-fast. Por otro lado, el iterador y listIterator devuelto por ArrayList son fallas rápido.
5) ¿Quién pertenece a collection framework realmente? El vector no era parte del marco de colección, se ha incluido en colecciones más tarde. Se puede considerar como código heredado. No hay nada sobre Vector que la colección de listas no pueda hacer. Por lo tanto, el vector debe evitarse. Si hay una necesidad de operación segura para subprocesos, sincronice ArrayList como se explica en la siguiente sección de este post o use CopyOnWriteArrayList, que es una variante segura para subprocesos de ArrayList.
Hay pocas similitudes entre estas clases que son las siguientes:
- Tanto Vector como ArrayList utilizan una estructura de datos de matriz cultivable.
- El iterador y el listIterador devueltos por estas clases (Vector y ArrayList) son rápidos de error.
- Ambas son clases de colección ordenadas, ya que mantienen el orden de inserción de los elementos.
- Vector & ArrayList permite valores duplicados y nulos.
- Ambos crecen y se encogen automáticamente cuando se produce un desbordamiento y una eliminación.
¿Cuándo usar ArrayList y cuándo usar vector?
Depende totalmente del requisito. Si es necesario realizar una operación «segura para hilos», el vector es su mejor opción, ya que garantiza que solo 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 una operación segura de 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 aún así, si es necesario, puede sincronizarlos de esta manera:
//Use Collecions.synzhonizedList methodList 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(); ...}