¿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 utilizar cada una de ellas?
Diferencias
- Los vectores están sincronizados, los ArrayLists no.
- Métodos de crecimiento de datos
Utilice ArrayLists si no existe un requisito específico para utilizar 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. Modificación estructural significa agregar o eliminar elemento(s) de la lista. Establecer el valor de un elemento existente no es una modificación estructural.
Collections.synchronizedList
normalmente se utiliza en el momento de la creación de la lista para evitar cualquier acceso no sincronizado accidental a la lista.
Crecimiento de datos
Internamente, tanto ArrayList como Vector conservan su contenido mediante 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 el tamaño de su matriz en un 50 por ciento.
Como dice la documentación, ay Vector
an ArrayList
son casi equivalentes. La diferencia es que el acceso a a Vector
está sincronizado, mientras que el acceso a an ArrayList
no lo está. Lo que esto significa es que sólo un hilo puede llamar a métodos a Vector
la vez, y hay una ligera sobrecarga al adquirir el bloqueo; si usa un ArrayList
, este no es el caso. Generalmente, querrás usar un ArrayList
; en el caso de un solo subproceso, es una mejor opción y, en el caso de varios subprocesos, se obtiene un mejor control sobre el bloqueo. ¿Quiere permitir lecturas simultáneas? Bien. ¿Quiere realizar una sincronización para un lote de diez escrituras? También está bien. Requiere un poco más de cuidado por tu parte, pero probablemente sea lo que deseas. También tenga en cuenta que si tiene un ArrayList, puede usar la Collections.synchronizedList
función para crear una lista sincronizada, obteniendo así el equivalente a un archivo Vector
.
Vector
es una clase rota que no es segura para subprocesos, a pesar de estar "sincronizada" y solo la utilizan estudiantes y otros programadores sin experiencia.
ArrayList
es la implementación de Lista de referencia utilizada por profesionales y programadores experimentados.
Los profesionales que desean una implementación de Lista segura para subprocesos utilizan un archivo CopyOnWriteArrayList
.
ArrayList
Es más nuevo y entre un 20 y un 30 % más rápido.
Si no necesita algo explícitamente aparente en Vector
, useArrayList