Итерация по EnumMap # entrySet

Перечисление над 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 давно исправлен?

9
задан Premraj 3 June 2011 в 05:57
поделиться