2009-01-17 12 views
12

Un meme que se estresa con el desarrollo de Java es siempre usar ArrayList sobre vectorial. Vector está en desuso. Eso puede ser cierto, pero Vector y Hashtable tienen la ventaja de que están sincronizados.Uso Hashtable, Vector o HashMap o ArrayList en Java

estoy trabajando con una aplicación orientada en gran medida concurrente, ¿no beneficiar a utilizar los objetos que se sincronizan como vector? Parece que tienen su lugar?

+0

El vector no ha sido desaprobado todavía. – Champ

+0

La última versión de Java 6 con Netbeans afirma que Vector está en desuso ... Debe haber sido anunciado en otro lugar hace un tiempo, porque tengo notas que datan de hace unos meses sobre la necesidad de encontrar un reemplazo para él y los problemas con algunos -Las clases desaprobadas aún lo necesitan. –

Respuesta

17

El problema con Vector y Hashtable es que están sincronizados sólo a nivel local. No se romperán (como en los datos corruptos) en una aplicación simultánea, sin embargo, debido a la sincronización local (por ejemplo, get se sincroniza, pero solo hasta que obtenga devoluciones), querrá realizar su propia sincronización de todos modos para situaciones como como iteración sobre el contenido. Ahora, incluso su método de puesta necesita alguna sincronización adicional para cooperar con la sincronización de iteración y termina con una situación en la que su Hashtable/Vector está doblemente sincronizado.

+0

¿Qué es exactamente incorrecto? – falstro

+0

Eliminé mi comentario por error. Usted es incorrecto de que put() necesite sincronización agregada; el iterador() simplemente se sincronizaría en el vector en sí, lo que excluye toda la sincronización dentro del vector. En esto, son idénticos a Collections.synchronizedList(). –

+0

Si usa su iterador en un bucle for, el contenido de for-loop no se sincronizará y su iterador probablemente lanzará una excepción de modificación concurrente si alguien utiliza poner entre 'next'. Por lo tanto, necesita sincronización adicional (hay otras opciones también, por supuesto). – falstro

13

Si necesita una sincronización ArrayList o HashMap, puede envolverlos.

List list = Collections.synchronizedList(new ArrayList(...)); 
Map m = Collections.synchronizedMap(new HashMap(...)); 

Personalmente, creemos que los métodos "sincronizados" en estas colecciones no es muy útil en el código roscado pesada. Hay algunas colecciones más nuevas que ayudan mucho más, pero sobre todo me encuentro haciendo mis propios objetos de sincronización y sincronizando a su alrededor, o usando los nuevos bloqueos en java.util.concurrent

8

La sincronización tiene su lugar, pero ese no es el única diferencia entre Vector y ArrayList. Vector crece su matriz de almacenamiento interno en una cantidad fija cada vez que se excede su capacidad, mientras que ArrayList crece por un factor fijo, que suele ser un enfoque mucho mejor (ya que da una amortized cost de O (1) para anexar un elemento).

También tenga en cuenta que Collections.synchronizedList() se puede utilizar para crear una vista sincronizada en cualquier List aplicación, por lo que no tiene que estar sujeto a las características de Vector (es posible que desee un sincronizado LinkedList por ejemplo).

+2

No del todo. Si no configuras capacityIncrement en un vector, se duplicará su tamaño cuando se necesite capacidad adicional. –

+0

¡Parece que debo haber olvidado esto! –

0

Me parece que las únicas veces que había necesidad de la propia colección para estar seguro de rosca son:

  • Si la colección es visible desde fuera de la clase (ámbito público o por defecto)
  • Si usted está volviendo un identificador de la colección de un método
  • Si la colección es un miembro estático de la clase

Todos estos son probablemente una mala ideas de diseño inteligente.

Un mejor enfoque sería hacer que la propia colección privada o protegida, y acceder a ella a través de métodos sincronizados. En el caso del miembro estático, si tuviera la necesidad de hacerlo, un Singleton sería una mejor forma de hacerlo.

17

ConcurrentHashMapway faster es que la tabla hash.Es concurrente, no solo sincronizado. Admite múltiples lectores/escritores a la vez.

Sin embargo, no existe una lista de arreglos 'concurrentes'. Dependiendo de sus necesidades, CopyOnWriteArrayList puede o no ser lo que necesita.

Cuestiones relacionadas