¿Cuáles son las diferencias entre ArrayList y Vector?

¿Cuáles son las diferencias entre las dos estructuras de datos ArrayList y Vector , y dónde debería usar cada una de ellas?

Diferencias

  • Los vectores están sincronizados, ArrayLists no lo son.
  • Métodos de crecimiento de datos

Use ArrayLists si no hay un requisito específico para usar vectores.

Sincronización

Si varios hilos acceden a un ArrayList simultáneamente, entonces debemos sincronizar externamente el bloque de código que modifica la lista ya sea estructuralmente o simplemente modifica un elemento. La modificación estructural significa la adición o eliminación de elemento (s) de la lista. Establecer el valor de un elemento existente no es una modificación estructural.

Collections.synchronizedList se usa normalmente en el momento de la creación de la lista para evitar el acceso no sincronizado accidental a la lista.

Referencia

Crecimiento de datos

Internamente, ArrayList y Vector mantienen sus contenidos usando una matriz. Cuando un elemento se inserta en una ArrayList o un Vector, el objeto necesitará expandir su matriz interna si se queda sin espacio. Un Vector está predeterminado para duplicar el tamaño de su matriz, mientras que ArrayList aumenta su tamaño de matriz en un 50 por ciento.

Referencia

Como dice la documentación, un Vector y un ArrayList son casi equivalentes. La diferencia es que el acceso a un Vector está sincronizado, mientras que el acceso a un ArrayList no lo está. Lo que esto significa es que solo un hilo puede llamar a los métodos en un Vector a la vez, y hay una ligera sobrecarga en la adquisición del locking; si usa una ArrayList , este no es el caso. En general, querrá usar una ArrayList ; en el caso de una sola rosca es una mejor opción, y en la caja de múltiples roscas, obtiene un mejor control sobre el locking. ¿Quieres permitir lecturas concurrentes? Multa. ¿Desea realizar una sincronización para un lote de diez escrituras? También está bien. Requiere un poco más de cuidado de su parte, pero es probable que sea lo que desea. También tenga en cuenta que si tiene una ArrayList, puede usar la función Collections.synchronizedList para crear una lista sincronizada, obteniendo así el equivalente de un Vector .

Vector es una clase rota que no es segura, a pesar de que está “sincronizada” y solo la usan los estudiantes y otros progtwigdores inexpertos.

ArrayList es la implementación de la lista de acceso utilizada por profesionales y progtwigdores experimentados.

Los profesionales que desean una implementación de lista de hilos utilizan una CopyOnWriteArrayList .

ArrayList es más nuevo y 20-30% más rápido.

Si no necesita algo explícitamente evidente en Vector , use ArrayList

Hay 2 grandes diferencias entre Vector y ArrayList.

  1. El vector está sincronizado por defecto, y ArrayList no lo está. Nota: puede hacer que ArrayList también se sincronice al pasar el objeto arraylist al método Collections.synchronizedList (). Sincronizado significa que se puede usar con múltiples hilos sin ningún efecto secundario.

  2. ArrayLists crece un 50% del tamaño anterior cuando el espacio no es suficiente para un nuevo elemento, mientras que Vector crecerá un 100% del tamaño anterior cuando no haya espacio para el nuevo elemento entrante.

Aparte de esto, hay algunas diferencias prácticas entre ellos, en términos de esfuerzo de progtwigción:

  1. Para obtener el elemento en una ubicación particular de Vector usamos la función elementAt (int index). El nombre de esta función es muy largo. En lugar de esto, en ArrayList tenemos get (int index) que es muy fácil de recordar y usar.
  2. Del mismo modo, para reemplazar un elemento existente con un elemento nuevo en Vector, usamos el método setElementAt (), que de nuevo es muy largo y puede irritar al progtwigdor para usarlo repetidamente. En lugar de esto, ArrayList tiene un método add (int index, object) que es fácil de usar y recordar. Así tienen más nombres de funciones amigables para el progtwigdor y fáciles de usar en ArrayList.

¿Cuándo usar cuál?

  1. Intenta evitar el uso de vectores por completo. ArrayLists puede hacer todo lo que un Vector puede hacer. Más de ArrayLists por defecto no están sincronizados. Si lo desea, puede sincronizarlo cuando lo necesite utilizando la clase Utilidades de colecciones.
  2. ArrayList tiene fácil recordar y usar nombres de funciones.

Nota : aunque el arraylist crece en un 100%, puede evitar esto asegurando el método de capacidad () para asegurarse de que está asignando suficiente memoria en las etapas iniciales.

Espero eso ayude.

Básicamente, tanto ArrayList como Vector usan matriz de objetos interna.

ArrayList: la clase ArrayList extiende AbstractList e implementa la interfaz List y RandomAccess (interfaz de marcador). ArrayList admite matrices dinámicas que pueden crecer según sea necesario. Nos da la primera iteración sobre los elementos. ArrayList usa matriz de objetos interna; se crean con un tamaño inicial predeterminado de 10. Cuando se excede este tamaño, la colección aumenta automáticamente a la mitad del tamaño predeterminado que es 15.

Vector: Vector es similar a ArrayList pero las diferencias son, está sincronizado y su tamaño inicial predeterminado es 10 y cuando el tamaño excede su tamaño aumenta al doble del tamaño original, lo que significa que el nuevo tamaño será 20. Vector es la única clase que no sea ArrayList para implementar RandomAccess. Vector tiene cuatro constructores que toman dos parámetros Vector (int initialCapacity, int capacityIncrement) capacityIncrement es la cantidad por la cual la capacidad se incrementa cuando el vector se desborda, por lo que tiene más control sobre el factor de carga.

Algunas otras diferencias son: enter image description here

ArrayList y Vector implementan la interfaz de lista y mantienen el orden de inserción. Pero hay muchas diferencias entre las clases ArrayList y Vector

ArrayList –

  1. ArrayList no está sincronizado.
  2. ArrayList incrementa el 50% del tamaño de la matriz actual si el número de elementos excede su capacidad.
  3. ArrayList no es una clase heredada, se presenta en JDK 1.2.
  4. ArrayList es rápido porque no está sincronizado.
  5. ArrayList usa la interfaz Iterator para recorrer los elementos.

Vector –

  1. Vector está sincronizado.
  2. Incrementos de Vector 100% significa duplica el tamaño de la matriz si el número total de elementos excede su capacidad.
  3. Vector es una clase heredada.

  4. Vector es lento porque está sincronizado, es decir, en el entorno de subprocesos múltiples, mantendrá los otros subprocesos en estado ejecutable o no ejecutable hasta que el subproceso actual libere el locking del objeto.

  5. Vector utiliza la interfaz de enumeración para recorrer los elementos. Pero también puede usar Iterator.

Ver también: https://www.javatpoint.com/difference-between-arraylist-and-vector

ArrayList Vs Vector:

1) Sincronización: ArrayList no está sincronizado, lo que significa que múltiples subprocesos pueden funcionar 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 la 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á 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 redimensionaron es diferente. ArrayList crece a la mitad de su tamaño cuando se redimensiona mientras Vector duplica el tamaño de sí mismo de forma predeterminada cuando crece.

3) Rendimiento: 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 funciona en Vector obtiene un locking que hace que otros subprocesos esperen hasta que se libere el locking.

4) fallido: Primero permítame 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 del iterador, el iterador lanzará ConcurrentModificationException. La modificación estructural se refiere a la adición o eliminación de elementos de la colección.

Según el Vector javadoc, la Enumeración devuelta por Vector no es a prueba de fallas. Por otro lado, el iterador y el listIterator 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 recostackción, se ha incluido en las colecciones más adelante. Se puede considerar como código heredado. No hay nada sobre Vector que la colección de Lista no pueda hacer. Por lo tanto Vector debe ser evitado. Si hay una necesidad de operación segura de 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 pocas similitudes entre estas clases que son las siguientes:

Tanto Vector como ArrayList usan growable array data structure . El iterador y listIterator devueltos por estas clases (Vector y ArrayList) fail-fast son fail-fast . Ambas son clases de ordered collection , ya que mantienen el orden de inserción de los elementos. Vector & ArrayList allows duplicate and null values . Ambos crecen y se contraen automáticamente cuando se produce el desbordamiento y la eliminación.

  1. El vector está sincronizado por defecto, y ArrayList no lo está. Nota: puede hacer que ArrayList también se sincronice al pasar el objeto arraylist al método Collections.synchronizedList (). Sincronizado significa que se puede usar con múltiples hilos sin ningún efecto secundario.

  2. ArrayLists crece un 50% del tamaño anterior cuando el espacio no es suficiente para un nuevo elemento, mientras que Vector crecerá un 100% del tamaño anterior cuando no haya espacio para el nuevo elemento entrante.

Similitudes

  • Ambas colecciones implementan la interfaz de lista, por lo tanto, exponen operaciones similares para agregar, editar y eliminar operaciones.
  • Ambos almacenan sus artículos en una matriz dinámica dentro de la memoria.
  • Ambos mantienen el orden de inserción de sus elementos, es decir, los elementos se recuperan con el mismo orden de inserción.
  • Ambos permiten nulos y elementos duplicados.

Diferencias

  • El vector está implícitamente sincronizado, funciona perfectamente con entornos de subprocesos múltiples. En cada acceso, el hilo adquiere un locking en el Vector, impidiendo que cualquier otro hilo lo modifique simultáneamente. Por el contrario, ArrayList no está sincronizado por defecto, por lo que múltiples hilos pueden acceder y modificarlo al mismo tiempo. Para lograr la sincronización, un desarrollador debe rodear explícitamente cada modificación en ArrayList con un bloque sincronizado O convertirlo a una lista sincronizada usando Collections.synchronizedList.
  • ArrayList es más rápido que Vector debido al hecho de que Vector comprueba implícitamente la sincronización en cada llamada a un método, incluso en un único entorno con hebras.
  • Vector y ArrayList usan una matriz dinámica para almacenar sus elementos. Cuando esta matriz se queda sin espacio, ArrayList aumenta el tamaño de la matriz al 50% del tamaño actual, mientras Vector lo aumenta al 100%. Entonces, claramente Vector consume más memoria que ArrayList.

Referencia: ArrayList vs Vector