【发布时间】:2011-06-01 08:18:03
【问题描述】:
枚举Map#entrySet 不能按预期对所有 Map 实现工作,特别是对于 EnumMap,IdentityHashMap,这是来自 Josh Bloch 的 puzzler presentation (Puzzle 5) 的示例代码 -
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());
}
}
是的,这会产生错误的结果 -
应该是
2
2
但产生
2
1
但是如果我尝试使用下面的代码 - 它会产生正确的结果
更新
虽然结果 Set 的大小是 2,但 Entries 是相同的。
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());
}
}
我什至用两种不同的枚举类型作为键和值尝试了上面的代码。
这似乎只有在 EnumMap 具有与键和值相同的枚举时才有问题。
我想知道这是为什么?或者我遗漏了一些东西。为什么当 ConcurrentHashMap 很久以前修复时它没有修复?
【问题讨论】:
-
我在 IntelliJ 中接收:2, 2
标签: java collections enums map