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.
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.
¿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.
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.
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.
¿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.
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:
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.
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?
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.
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.
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 ...
Vector 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.
Vectorutiliza la interfaz de enumeración para atravesar los elementos. Pero también puede usar Iterator.
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.
¿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.
Vector v = new Vector(3, 2);
Vector
, utilizaciónArrayList
oLinkedList
oArrayDeque
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.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
fuente
Como dice la documentación, a
Vector
y anArrayList
son casi equivalentes. La diferencia es que el acceso a unVector
está sincronizado, mientras que el acceso a unArrayList
no. Lo que esto significa es que solo un subproceso puede invocar métodosVector
a la vez, y hay una ligera sobrecarga en la adquisición del bloqueo; si usa unArrayList
, 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 aVector
.fuente
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
.fuente
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
fuente
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.
fuente
ArrayList
yVector
ambos implementan la interfaz de Lista y mantienen el orden de inserción. Pero hay muchas diferencias entreArrayList
yVector
clases ...ArrayList -
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
fuente
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:
fuente