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

352

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

KushalP
fuente
55
No estoy viendo el duplicado exacto aquí.
Jeff Atwood
2
Bueno, también puedes crear vectores en Java Vector v = new Vector(3, 2);
sgsi
Nunca uso Vector, utilización ArrayListo LinkedListoArrayDeque

Respuestas:

365

Las diferencias

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

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

Sincronización

Si varios subprocesos acceden a una 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 elementos de la lista. Establecer el valor de un elemento existente no es una modificación estructural.

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

Referencia

Crecimiento de datos

Internamente, tanto ArrayList como Vector mantienen sus contenidos usando un Array. Cuando se inserta un elemento en una ArrayList o un Vector, el objeto necesitará expandir su matriz interna si se queda sin espacio. Por defecto, un Vector duplica el tamaño de su matriz, mientras que ArrayList aumenta su tamaño de matriz en un 50 por ciento.

Referencia

Sev
fuente
77
@Rei Exactamente lo que dijo: Múltiples hilos ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException
¿Qué pasa con la LECTURA de una ArrayList de manera multiproceso? ¿Es seguro para subprocesos?
Xunie
@Xunie Leer de ArrayList u otras clases de colección nunca será un problema. El problema surge cuando agrega, elimina o modifica valores existentes en ArrayList o la colección.
sainath reddy
85

Como dice la documentación, a Vectory an ArrayListson casi equivalentes. La diferencia es que el acceso a un Vectorestá sincronizado, mientras que el acceso a un ArrayListno. Lo que esto significa es que solo un subproceso puede invocar métodos Vectora la vez, y hay una ligera sobrecarga en la adquisición del bloqueo; si usa un ArrayList, este no es el caso. En general, querrá usar unaArrayList ; en el caso de un solo subproceso es una mejor opción, y en el caso de varios subprocesos, obtiene un mejor control sobre el bloqueo. ¿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 atención por tu parte, pero es probable que sea lo que quieres. También tenga en cuenta que si tiene una ArrayList, puede usar elCollections.synchronizedListfunción para crear una lista sincronizada, obteniendo así el equivalente de a Vector.

Antal Spector-Zabusky
fuente
53

Vectores una clase interrumpida que no es segura para subprocesos, a pesar de estar "sincronizada" y solo es utilizada por estudiantes y otros programadores sin experiencia.

ArrayList es la implementación de la Lista de acceso utilizada por profesionales y programadores experimentados.

Los profesionales que desean una implementación de Lista segura para hilos utilizan a CopyOnWriteArrayList.

Bohemio
fuente
10
sincronizado pero no seguro ¿Qué significa eso? [Soy principiante]
Dineshkumar
13
@Dineshkumar Vectorestaba destinado a ser seguro para subprocesos, pero tiene una falla de diseño que lo hace * no de hecho seguro para subprocesos, es básicamente una clase obsoleta. Por alguna razón, las universidades, etc., no han escuchado acerca de esta noticia y aún recomiendan su uso.
Bohemio
1
@Dineshkumar ve esta pregunta
Bohemian
3
@Dineshkumar lo siento, ese no fue un buen enlace. Aquí está la respuesta definitiva . En resumen, su sincronización es inútil.
Bohemio
77
Dato curioso: The Stack of Java1.7 usa la clase Vector.
Tobi
26

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

Si no necesita algo explícitamente evidente Vector, useArrayList

Oli
fuente
32
¿Puedes respaldar el reclamo dando pruebas de 20-30% faster?
usuario
55
@user En ese momento, era solo una experiencia personal de clunking en grandes matrices. En tres años, no puedo señalar exactamente de qué estaba hablando, pero hay muchos puntos de referencia. No es hasta enhebrar donde ve los saltos más grandes, pero aquí hay uno: javacodegeeks.com/2010/08/…
Oli
El 20-30% solo coincide, si lee Y escribe en el Vector / Arraylist, ya que la función de crecimiento tendrá el mayor impacto. Si tiene un punto de referencia que escribe solo una vez y luego realiza lecturas, solo obtendrá un resultado diferente
Tobi
2
Proporcione una evidencia a sus datos
wiredmark
Dado que el vector está sincronizado y la lista de matrices no está sincronizada, esa puede ser una razón, la lista de matrices es más rápida que el vector.
PREGUNTE
23

Hay 2 diferenciaciones principales entre Vector y ArrayList.

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

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

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

  1. Para obtener el elemento en una ubicación particular de Vector, utilizamos 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. De manera similar, para reemplazar un elemento existente con un nuevo elemento en Vector, usamos el método setElementAt (), que de nuevo es muy largo y puede irritar al programador para que lo use repetidamente. En lugar de esto, ArrayList tiene un método add (int index, object) que es fácil de usar y recordar. De esta forma, tienen nombres de funciones más fáciles de usar y fáciles de usar en ArrayList.

¿Cuándo usar cuál?

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

Nota : aunque la lista de arrays crece al 100%, puede evitar esto asegurando el métodocapacity () para asegurarse de que está asignando suficiente memoria en las etapas iniciales.

Espero eso ayude.

usuario1923551
fuente
55
Información incorrecta (activada) sobre el tamaño de crecimiento para ArrayLIst y Vector, de lo contrario, es una respuesta bastante buena.
Nenad Bulatovic el
El crecimiento de Vector se duplica con los documentos necesarios docs.oracle.com/javase/7/docs/api/java/util/Vector.html mientras que en ArrayList "Los detalles de la política de crecimiento no se especifican más allá del hecho de que agregar un elemento tiene costo de tiempo amortizado constante ". docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib
No entiendo cómo el nombre del método puede ser un criterio para usar o no usar ese método.
Surender Kherwa
14

ArrayListy Vectorambos implementan la interfaz de Lista y mantienen el orden de inserción. Pero hay muchas diferencias entre ArrayListy Vectorclases ...

ArrayList -

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

Vector -

  1. Vector está sincronizado
  2. Vector incrementos de 100% significa que 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 un entorno de subprocesos múltiples, mantendrá los otros subprocesos en estado ejecutable o no ejecutable hasta que el subproceso actual libere el bloqueo del objeto.

  5. Vectorutiliza la interfaz de enumeración para atravesar los elementos. Pero también puede usar Iterator.

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

roottraveller
fuente
10

Básicamente, tanto ArrayList como Vector usan ambos Object Array interno.

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 utiliza la 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 aparte de ArrayList para implementar RandomAccess. Vector tiene cuatro constructores de los cuales uno toma dos parámetros. Vector (int initialCapacity, int capacityIncrement) capacityIncrement es la cantidad en la que la capacidad aumenta cuando el vector se desborda, por lo que tiene más control sobre el factor de carga.

Algunas otras diferencias son: ingrese la descripción de la imagen aquí

subhashis
fuente
1
¿Por qué agregar objetos al principio y al final en LinkedList es lento? ¿No debería ser más rápido que AMBOS arrayList y vector?
CHANist
@CHANist Estoy de acuerdo también. Agregar un objeto al inicio y al final debe ser más rápido que agregar un objeto en el medio.
Rahul Rastogi
1
El lenguaje utilizado en la columna LinkedList de esta tabla es contradictorio. Tanto anteponer como agregar a LinkedList es más rápido que agregar elementos en el medio, pero más lento que anteponer o agregar a ArrayLists o Vectors. Esto se debe a que cada inserción requiere asignación de memoria con referencias no locales, lo que aumenta la posibilidad de errores de caché. Aunque la búsqueda en LinkedList es lineal con el número de elementos y no se almacena un puntero al final, la adición es aún más rápida que la preposición porque la memoria solo se reasigna para un elemento.
Sophia Gold