Vector o ArrayList
Clase Vector o Clase ArrayList
¿Qué es mejor usar en Java? ¿Un Vector o un ArrayList?
- Sincronización: La clase Vector es sincronizada (synchronized), por tanto, su contenido está protegido de otros hilos, es decir, es thread-safe(Wiki).
Y al contrario, los ArrayList no son sincronizados y por tanto no son thread-safe. Hay que tener en cuanta esto porque los vectores tienen un coste en tiempo de ejecución que no tienen los ArrayList. Si no necesitas thead-safe, usa ArrayList.
- Tamaño de los datos:Ambas estructuras necesitan un Array para almacenar los datos internamente. Cuando se insertan datos, tanto unos como otros tienen que crecer para que no haya un desbordamiento. He aquí la diferencia:
Los vectores crecen duplicando su espacio
Los ArrayList crecen añadiendo el 50% de su espacio anterior.
:)
- soulpower's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
Habria que mencionar que a
Habria que mencionar que a Vector se le puede asignar una capacidad de incremento deseada :) , como:
new Vector(capacidad_inicial, incremento);
no siempre duplican su espacio :P , buen blog soulpower n.n , felicidades
=)
Saludos
Hola me parece muy interesante, pero podrías ser más especifico?...podrías demostrar lo que dices por favor :D no se tal vez con alguna prueba de profiling o midiendo la cantidad de memoria en heap que ocupen cada una de la estructuras antes descritas. Te lo agradeceríamos enormemente. Saludos
Ejemplo
Corran este programita y vean los resultados en su propia compu. Van a variar incluso de una corrida a otra, pero consistentemente será bastante menor el tiempo que tarda el ArrayList en agregar 10mil elementos.
import java.util.ArrayList;
public class PruebaListas {
public static void main(String[] args) {
long t0, t1, t2;
Vector v = new Vector(10000, 50);
ArrayList a = new ArrayList(10000);
v.add(new Integer(0));
a.add(new Integer(0));
//Ahora agreguemos 10000 elementos al vector
t0 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
v.add(Integer.toString(i));
}
t1 = System.currentTimeMillis();
long tv = t1-t0;
//Y luego 10000 elementos al arraylist
t0 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
a.add(Integer.toString(i));
}
t1 = System.currentTimeMillis();
long ta = t1-t0;
System.out.printf("10K elementos en Vector tarda %d%n", tv);
System.out.printf("10K elementos en ArrayList tarda %d%n", ta);
}
}
Yo creo que es ligeramente
Yo creo que es ligeramente menor el tiempo en ArrayList por que Vector es sincronizada.
Para definir el incremento
Para definir el incremento en un Vector se puede usar el contructor public Vector(int initialCapacity, int capacityIncrement)
Velocidad
Sí, el punto era demostrar que ArrayList es más rápido porque no es sincronizado. Eso se menciona en el post original y es lo que un comentario posterior pedía demostración. Y el constructor que usé en el ejemplo para Vector, usa el parámetro de incremento en la capacidad del mismo.
ArrayList
ArrayList
despues de poco mas de 8 años
Hoy me encontré con este hilo y quería hacer un ejercicio de pruebas parametrizadas con jUnit así que tome esta discusión como pretexto y el código del buen @ezamudio para mi ejercicio con un par de peques modificaciones.
Tome t0 desde antes de la construcción para no solo tomar en cuenta la inserción y las colecciones toma enteros no cadenas.
Realice los siguientes jUnits:
Interesante los resultados, llega un punto en que vector tiene mejor desempeño aunque es esporádico.
Vector:
ArrayList
Y bueno ahí pueden jugar con el rate de incremento para comparar otros datos.
Y el warming?
Y el Warming? dónde está el Warming?
A veces es bueno correr unos ciclos de calentamiento para obtener resultados más adecuados.
Saludos!
Orales no había escuchado de
Orales no había escuchado de eso.
Que es y como se come?
Son de mis primeras pruebas parametrizadas o donde hay ciclos de por medio.
Pon a tu peresozo JDK a hacer calentamiento hasta que sude!
No, no estoy hablando de que tu código Java tenga que hacer cardio...
La primera vez que ejecutas tu código corre significativamente más lento que en veces posteriores, a veces puede ser debido a la carga peresoza, a el uso de compiladores hot-spot o simplemente por la inicialización propia. Si tu código se ejecuta varias veces es muy posible que la segunda vez se reutilice el código y los espacios de memoria, y si estás comparando fragmentos de código similares, que el segundo reutilice elementos del primero, así que para realizar una prueba de performance que sea técnicamente aceptable por todos, lo ideal es correr en algunos ciclos las llamadas que vas a usar en tu programa antes de tomarle tiempo a las partes que te interesan, sin importar que tan trivial sea tu código, normalmente obtienes grandes diferencias de tiempo si haces un calentamiento.
Por ejemplo: para comparar el tiempo de la asignación dentro de un ciclo contra el tiempo fuera de un ciclo
Podríamos usar el siguiente código:
Este tema es bien interesante, es una lástima que trascienda únicamente a nivel académico como una argucia teórica para optimizar el código.
Tech tlacuilosque
Neh ni mo Javatlacati ;)
warmup
cuando haces benchmarks en jvm, debes primero hacer unas rondas de calentamiento. Esto consiste en correr el benchmark varias veces, pero ignorar los resultados. El objetivo es que si las pruebas requieren alojar una cantidad significativa de memoria, lo hagan durante este calentamiento, y también que el JIT se active para que compile todo el código a nativo *antes* de que se hagan las mediciones. Es simple:
calentamiento();
}
benchmark();
El calentamiento debe ser una versión corta del benchmark, o si el benchmark no es demasiado largo, puede ser el mismo código que se ejecute varias veces.
Cuando vas a hacer mediciones de tiempo, también es muy recomendable que hagas varias mediciones y tomes promedio y varianza, no que hagas solamente una medición. Por ejemplo para la prueba de agregar un millón de elementos, la ejecutas mil veces pero creo que sólo tomas el tiempo total, cuando lo recomendable es que tomes el tiempo de cada vez que la ejecutas y al final saques promedio y varianza. Si la varianza sale alta, puede ser que algo ocurrió con el recolector de basura o con el JIT.
(varianza en este contexto me refiero a la varianza estadística, el cuadrado de la desviación estándar).
Gracias por los aportes
Gracias por los aportes
@ezamudio, @javatlacati. De hecho como comentas @javatlacati es precisamente lo que deseo hacer ir integrando este tipo de pruebas en donde me lo permitan y en módulos que considere críticos(falta aprender a discernir esto también), por eso es que estoy aprendiendo lo de pruebas parametrizadas, ya las había manoseado pero no le veía el uso especifico hasta que me tope con este hilo.
Y pues darle la formalidad de estas pruebas desde jUnit y que se ejecuten desde jenkins u otra cosa.
Re: Warm-UP
Duke calentando...
Re: "argucia teórica"
Pues sí. — Por cierto, he aquí un paper: "Statistically Rigorous Java Performance Evaluation" [PDF].
:-P
~~
@jpaul gracias por la
@jpaul gracias por la referencia