2008-08-27 26 views
7

¿Cuál es la forma más directa de crear una tabla hash (o matriz asociativa ...) en Java? Mi google-fu ha aparecido un par de ejemplos, pero ¿existe una forma estándar de hacerlo?¿Cómo creo una tabla hash en Java?

¿Y hay una forma de llenar la tabla con una lista de pares clave-> valor sin llamar individualmente a un método de agregar en el objeto para cada par?

Respuesta

23
Map map = new HashMap(); 
Hashtable ht = new Hashtable(); 

Ambas clases se puede encontrar en el paquete java.util. La diferencia entre los 2 se explica en el siguiente jGuru FAQ entry.

+1

+1, mencionas tanto Hashtable como HashMap. – bgw

+0

De la entrada jGuru: "La diferencia clave entre los dos es que el acceso al Hashtable está sincronizado en la tabla mientras que el acceso al HashMap no lo está. Puede agregarlo, pero no está allí por defecto. Otro La diferencia es que el iterador en el HashMap es a prueba de fallas, mientras que el enumerador del Hashtable no lo es. Si cambia el mapa mientras lo itera, lo sabrá ". – ErikAGriffin

2
import java.util.HashMap; 

Map map = new HashMap(); 
1

Lo que Edmund dijo.

En cuanto a no llamar .add todo el tiempo, no, no idiomáticamente. Habría varios hacks (almacenándolos en una matriz y luego bucles) que podría hacer si realmente quisiera, pero yo no lo recomendaría.

7

Además, no olvide que Map y Hashtable son genéricos en Java 5 y posteriores (como en cualquier otra clase en el Collections framework).

Map<String, Integer> numbers = new HashMap<String, Integer>(); 
numbers.put("one", 1); 
numbers.put("two", 2); 
numbers.put("three", 3); 

Integer one = numbers.get("one"); 
Assert.assertEquals(1, one); 
0

Y es que hay una manera de llenar la tabla con una lista de número-> pares de valores sin llamar individualmente un método add en el objeto para cada par?

Un problema con su pregunta es que no menciona en qué forma están sus datos para empezar. Si su lista de pares resulta ser una lista de objetos Map.Entry, sería bastante fácil.

Solo para descartar esto, hay una clase (muy difamada) llamada java.util.Properties que es una extensión de Hashtable. Solo espera llaves y valores de cadena y le permite cargar y almacenar los datos usando archivos o flujos. El formato del fichero, lee y escribe es el siguiente:

key1=value1 
key2=value2 

No sé si esto es lo que está buscando, pero hay situaciones en las que esto puede ser útil.

19

Puede usar llaves dobles para configurar los datos. Todavía se llama a añadir, o poner, pero es menos feo:

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{ 
    put("foo",  1); 
    put("bar",  256); 
    put("data",  3); 
    put("moredata", 27); 
    put("hello", 32); 
    put("world", 65536); 
}}; 
+1

Tu tipo de variable debería ser realmente un 'Mapa'. 'Map MYHASH = new Hashtable ()' –

0

Es importante tener en cuenta que la función de hash de Java no es el óptimo. Si quiere menos colisiones y elimina casi por completo el hash de nuevo al ~ 50% de capacidad, usaría un algoritmo Buz Hash Buz Hash

La razón por la cual el algoritmo de hash de Java es débil es más evidente en cómo hash Strings.

"a".hash() le dan la representación ASCII de "a"-97, por lo "b" habría 98. El objetivo de hashing es asignar un número arbitrario y "tan aleatorio como sea posible".

Si necesita una tabla hash rápida y sucia, por supuesto, use java.util. Si está buscando algo robusto que sea más escalable, buscaría implementar el suyo propio.