枚举结束Map#entrySet
对于所有 Map 实现,特别是 EnumMap,不能按预期工作,IdentityHashMap
这是 Josh Bloch 的示例代码谜题演示(谜题 5) http://strangeloop2010.com/system/talks/presentations/000/014/450/BlochLee-JavaPuzzlers.pdf?1290462274 -
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
but if I try with below code - it produces the correct result
UPDATE
虽然结果集的大小是 2,但条目是相同的。
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());
}
}
我什至尝试了上面的代码,使用两种不同的枚举类型作为键和值。
This seems to be issue only if EnumMap has a same enum as a key and value.
我想知道这是为什么?或者我遗漏了一些东西。为什么当 ConcurrentHashMap 很久以前就得到修复时它还没有修复?