Enumerar sobre Map#entrySet
no funciona como se espera para todas las implementaciones Mapa, especialmente para EnumMap, IdentityHashMap
y aquí está el código de ejemplo de Josh Bloch puzzler presentation (Puzzle 5) -interactuando sobre EnumMap # entrySet
public class Size {
private enum Sex { MALE, FEMALE }
public static void main(String[] args) {
printSize(new HashMap<Sex, Sex>());
printSize(new EnumMap<Sex, Sex>(Sex.class));
}
private static void printSize(Map<Sex, Sex> map) {
map.put(Sex.MALE, Sex.FEMALE);
map.put(Sex.FEMALE, Sex.MALE);
map.put(Sex.MALE, Sex.MALE);
map.put(Sex.FEMALE, Sex.FEMALE);
Set<Map.Entry<Sex, Sex>> set =
new HashSet<Map.Entry<Sex, Sex>>(map.entrySet());
System.out.println(set.size());
}
}
y sí que produce el resultado erróneo -
supone que es
2
2
pero produce
2
1
pero si lo intento con el código de abajo - se produce el resultado correcto
ACTUALIZACIÓN
Aunque el tamaño del conjunto resultante es 2, pero las entradas son iguales.
public class Test{
private enum Sex { MALE, FEMALE }
public static void main(String... args){
printSize(new HashMap<Sex, String>());
printSize(new EnumMap<Sex, String>(Sex.class));
}
private static void printSize(Map<Sex, String> map) {
map.put(Sex.MALE, "1");
map.put(Sex.FEMALE, "2");
map.put(Sex.MALE, "3");
map.put(Sex.FEMALE, "4");
Set<Map.Entry<Sex, String>> set =
new HashSet<Map.Entry<Sex, String>>(map.entrySet());
System.out.println(set.size());
}
}
Incluso probé el código anterior con los dos tipos de enum diferentes como clave y valor.
Esto parece ser un problema solo si EnumMap tiene la misma enumeración que una clave y un valor.
Me gustaría saber por qué es esto? o me falta algo. ¿Por qué no se solucionó cuando ConcurrentHashMap se arregló hace mucho tiempo?
que estoy recibiendo en IntelliJ: 2, 2 –