Перечисление над Map # entrySet
не работает должным образом для всех реализаций Map, особенно для EnumMap, IdentityHashMap
и здесь это пример кода из презентации головоломки Джоша Блоха (Головоломка 5) -
public class Size {
private enum Sex { MALE, FEMALE }
public static void main(String[] args) {
printSize(new HashMap());
printSize(new EnumMap(Sex.class));
}
private static void printSize(Map 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> set =
new HashSet>(map.entrySet());
System.out.println(set.size());
}
}
и да, который дает неправильный результат -
должен быть
2
2
, но дает
2
1
, но если я попробую с приведенный ниже код - он дает правильный результат
ОБНОВЛЕНИЕ
Хотя размер результирующего набора равен 2, но записи такие же.
public class Test{
private enum Sex { MALE, FEMALE }
public static void main(String... args){
printSize(new HashMap());
printSize(new EnumMap(Sex.class));
}
private static void printSize(Map map) {
map.put(Sex.MALE, "1");
map.put(Sex.FEMALE, "2");
map.put(Sex.MALE, "3");
map.put(Sex.FEMALE, "4");
Set> set =
new HashSet>(map.entrySet());
System.out.println(set.size());
}
}
Я даже пробовал приведенный выше код с двумя разными типами перечисления в качестве ключа и значение.
Это похоже на проблему, только если EnumMap имеет такое же перечисление, как ключ и значение.
Я хотел бы знать, почему это? или мне что-то не хватает. почему это не исправлено, когда ConcurrentHashMap давно исправлен?