2009-11-24 13 views
26

Anteriormente, siempre habría pensado que un Vector era bueno para usar para objetos no descriptivos cuando la longitud era desconocida. Por lo que yo sabía, pensé que también era seguro para subprocesosjava.util.Vector - alternatives

¿Qué cambiaría si Vector ya no se usara y cuál es la alternativa?

+1

Es curioso que 'Vector' no haya sido desaprobado. Supongo que ya que no hay un reemplazo de uno-por-uno, no lo han hecho. – skaffman

+0

Tenga en cuenta que esto también es cierto para Hashtable: utilice HashMap en su lugar. –

+0

@skaffman 'CopyOnWriteArrayList' es más o menos un reemplazo uno por uno en la medida en que es una implementación de' Lista' de hilos. Para la mayoría de los usos, 'CopyOnWriteArrayList' debería ofrecer un mejor rendimiento que' Vector' –

Respuesta

35

Debe usar ArrayList en lugar de Vector. Vector usó sincronización interna, pero eso rara vez es lo suficientemente bueno para la consistencia real, y solo ralentiza la ejecución cuando no es realmente necesario.

Ver también this stackoverflow question.

+11

Un buen punto acerca de que rara vez es "lo suficientemente bueno para la coherencia real". Si una colección es visible para múltiples hilos, probablemente debería usar (y comprender a fondo) la colección apropiada de 'java.util.concurrent'. Y si no es accesible para múltiples hilos, un 'ArrayList' es más barato. Elimine las áreas grises donde una colección "podría ser" utilizada por varios subprocesos: no se puede hacer una colección intrínsecamente segura para subprocesos; cómo lo usan sus clientes siempre es un factor. – erickson

+0

hoy en día, ¿sabes si Vector ha sido mejorado o si debemos seguir con ArrayList? –

+1

@AquariusPower El contrato especifica que necesita utilizar la sincronización, por lo que realmente no se puede mejorar. Dicho esto, una JVM moderna a veces podrá eliminar la sincronización como una optimización, pero en general, es mejor usar ArrayList. –

7

ArrayList es ahora la mejor clase para usar. Vector ahora se considera Legacy y tiene la sobrecarga de rendimiento adicional de ser Thread-Safe.

14

En su lugar, puede usar un ArrayList.

Si necesita una versión sincronizada, puede hacer algo como:

ArrayList arrayList = new ArrayList(); 

List synchList = Collections.synchronizedList(arrayList); 
7

Uso ArrayList cuando se necesita una aplicación List pero no es necesario hilo de seguridad, y el uso de CopyOnWriteArrayList cuando se necesita una aplicación que List es seguro para subprocesos

5

Vector es una clase de colección heredada de Java 1.0. En Java 1.2 (¡hace mucho tiempo!), Se agregó el Collections Framework que incluía nuevas clases de colección como ArrayList y HashMap, que estaban destinadas a reemplazar las clases heredadas Vector y Hashtable.

Como se dijo anteriormente, las clases de colecciones heredadas tenían sincronización incorporada, que es innecesaria para muchas aplicaciones. La sincronización tiene una sobrecarga de rendimiento, por lo que si no es necesario, no debe usarla.

En algunos casos (cuando el programa tiene varios subprocesos y varios subprocesos tienen acceso a los mismos datos), debe sincronizar sus colecciones. Algunas personas usarían entonces los viejos Vector o Hashtable clases, sino una forma mejor es utilizar un envoltorio de sincronización con por ejemplo un ArrayList:

// Your standard, unsynchronized list 
List<String> data = new ArrayList<String>(); 

// Use this to put it into a synchronization wrapper 
List<String> syncedData = Collections.synchronizedList(data); 

Consulte la documentación de la API de Collections.synchronizedList() (y otros métodos) para obtener más información.

+6

Si necesita una lista de seguridad para subprocesos, CopyOnWriteArrayList ofrece un mejor rendimiento (en la mayoría de los casos) que Collections.synchronizedList (datos) –

+0

@ Dónal Eso no es realmente cierto. –

+0

@StefanReich elabore –

Cuestiones relacionadas