¿Cuáles son las diferencias entre las dos estructuras de datos ArrayList y Vector , y dónde debe usar cada una de ellas?
Vector v = new Vector(3, 2);
¿Cuáles son las diferencias entre las dos estructuras de datos ArrayList y Vector , y dónde debe usar cada una de ellas?
Vector v = new Vector(3, 2);
Respuestas:
Las diferencias
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.
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.
Como dice la documentación, a Vector
y an ArrayList
son casi equivalentes. La diferencia es que el acceso a un Vector
está sincronizado, mientras que el acceso a un ArrayList
no. Lo que esto significa es que solo un subproceso puede invocar métodos Vector
a 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.synchronizedList
función para crear una lista sincronizada, obteniendo así el equivalente de a Vector
.
Vector
es 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
.
Vector
estaba 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.
ArrayList
es más nuevo y 20-30% más rápido.
Si no necesita algo explícitamente evidente Vector
, useArrayList
20-30% faster
?
Hay 2 diferenciaciones principales entre Vector y ArrayList.
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.
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:
¿Cuándo usar cuál?
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.
ArrayList
y Vector
ambos implementan la interfaz de Lista y mantienen el orden de inserción. Pero hay muchas diferencias entre ArrayList
y Vector
clases ...
ArrayList
no está sincronizadoArrayList
incrementa el 50% del tamaño actual de la matriz si el número de elementos excede su capacidad.ArrayList
no es una clase heredada, se introduce en JDK 1.2.ArrayList
es rápido porque no está sincronizado.ArrayList
usa la interfaz Iterator para atravesar los elementos.Vector -
Vector
está sincronizadoVector
incrementos de 100% significa que duplica el tamaño de la matriz si el número total de elementos excede su capacidad.Vector
Es una clase heredada.
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.
Vector
utiliza 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
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: