java - name - HashMap e int como clave
map string object get value (10)
Estoy intentando construir un HashMap que tendrá números enteros como claves y objetos como valores.
Mi sintaxis es:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Sin embargo, el error devuelto es - Error de sintaxis en token "int", Dimensiones esperadas después de este token - No entiendo por qué debería agregar una dimensión (es decir: hacer el int en una matriz) ya que solo necesito almacenar un dígito como clave
¿Qué puedo hacer?
¡Gracias por adelantado! :)
No entiendo por qué debería agregar una dimensión (es decir, convertir el int en una matriz) ya que solo necesito almacenar un dígito como clave.
Una matriz también es un Objeto, por lo que HashMap<int[], MyObject>
es una construcción válida que utiliza matrices en int como claves.
El compilador no sabe lo que quiere o lo que necesita, solo ve un constructo de lenguaje que es casi correcto y advierte lo que falta para que sea totalmente correcto.
HashMap no permite tipos de datos primitivos como argumentos. Solo puede aceptar objetos por lo
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
no trabajará.
Tienes que cambiar la declaración a
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
así que incluso cuando haces lo siguiente
myMap.put(2,myObject);
El tipo de datos primitivo se autoboxea a un objeto entero.
8 (int) === boxing ===> 8 (Integer)
Puede leer más sobre autoboxing aquí http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
La razón principal de que HashMap no permita las primitivas como claves es que HashMap está diseñado de tal manera que, para comparar las claves, utiliza el método equals () , y un método puede llamarse solo a un objeto que no está en una primitiva.
Por lo tanto, cuando int se autoboxea en Integer, Hashmap puede llamar al método equals () en el objeto Integer.
Por eso, debes usar Integer en lugar de int. Quiero decir que hashmap arroja un error al poner int como una clave (No sé el significado del error que se arroja)
Y si lo crees, puedes hacer que el rendimiento de Map sea más rápido al hacer una primitiva como clave, hay una biblioteca llamada FastUtil que contiene una implementación de Map con int type como clave.
Debido a esto, es mucho más rápido que Hashmap
No puede usar una primitiva porque HashMap usa el objeto internamente para la clave. Por lo tanto, solo puede usar un objeto que herede de Object (es decir, cualquier objeto).
Esa es la función put () en HashMap y como puede ver, usa Object for K:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
La expresión "k = e.key" debería dejarlo en claro.
Sugiero usar un contenedor como Integer y autoboxing.
Para todos los que codifican Java para dispositivos Android y termina aquí: use SparseArray para un mejor rendimiento
private final SparseArray<myObject> myMap = new SparseArray<myObject>();
con esto puedes usar int en lugar de Integer como
int newPos = 3;
myMap.put(newPos, newObject);
myMap.get(newPos);
Puede intentar usar Trove http://trove.starlight-systems.com/
TIntObjectHashMap es probablemente lo que estás buscando.
Si codifica en Android, existe SparseArray , asignando un entero a un objeto.
Use Integer
lugar.
HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();
Java automáticamente autobox sus valores primitivos int
a objetos Integer
.
Lea más sobre el autoboxing de la documentación de Oracle Java.
Utilice HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
utiliza int como objeto no como tipo primitivo
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();