2010-03-24 16 views
24

El compilador se queja de este código:¿Por qué el compilador Java no le gusta primitive int como tipo para los valores en HashMap?

HashMap<String,int> userName2ind = new HashMap<String,int>(); 
    for (int i=0; i<=players.length; i++) { 
     userName2ind.put(orderedUserNames[i],i+1); 
    } 

escribe "tipo inesperada" y el punto en int. Si reemplazo int por String y i+1 por i+"1", la compilación va bien. ¿Qué pasa con aquí?

+0

No i + "1" termina siendo "01" para i == 0; "11" para i == 1 etc. – extraneon

+0

Sí. i + "1" termina siendo "01" para i == 0 y así sucesivamente. – Roman

+0

googlear "java hashmap int" apunta a muchas referencias que ya han pedido/resuelto este problema. Investigue su pregunta primero. – user2573153

Respuesta

41

Está bien con Integer, pero no está bien con int - Java generics only work with reference types, básicamente :(

probar este - a pesar de ser conscientes de que se casilla todo:

HashMap<String,Integer> userName2ind = new HashMap<String,Integer>(); 
for (int i=0; i<=players.length; i++) { 
    userName2ind.put(orderedUserNames[i],i+1); 
} 
2

Si usted tiene pequeñas colecciones, a continuación, utilizando los tipos de referencia probablemente estén bien, pero hay alternativas y una buena es trove4j. Trove hace un buen trabajo al recrear la API de colecciones utilizando primitivas puras. La recompensa es mucho menos menos uso de memoria y en muchos casos, mejor rendimiento al insertar/buscar. Su ejemplo se vería así:

TObjectIntHashMap<String> userName2ind = new TObjectIntHashMap<String>(); 
for (int i=0; i<=players.length; i++) { 
    userName2ind.put(orderedUserNames[i],i+1); 
} 

El único inconveniente, en mi experiencia, es la ausencia de implementaciones simultáneas de estos, así que hay que encontrar otra manera de gestionar la seguridad hilo.

Cuestiones relacionadas