我正在研究EnumMap,我想知道为什么它是故障安全的,尽管EnumMap的所有方法都没有同步。
我不是在密钥集上使用迭代器,而是在每个循环中使用
public class JavaEnumMapExample {
public enum MealType {
BREAKFAST, LUNCH, SNACK, DINNER
}
public static void main(String[] args) {
Map<MealType, String> myMealMap = new EnumMap<MealType, String>(MealType.class);
// populate the map
myMealMap.put(MealType.BREAKFAST, "Enjoy Milk and Eggs for breakfast!");
myMealMap.put(MealType.LUNCH, "Enjoy Chicken, Rice and bread for Lunch!");
myMealMap.put(MealType.SNACK, "How about an apple for the evening snack!");
myMealMap.put(MealType.DINNER, "Keep the dinner light, lets have some salad!");
System.out
.println("Welcome to meal planner, we have suggestions for following meals : ");
// print all the keys of enum map in sorted order
System.out.println(myMealMap.keySet());
// We can get the value from enumType
System.out.println(" Q: What should I have for lunch? ");
System.out.println(" A: " + myMealMap.get(MealType.LUNCH));
System.out.println(" Q: What should I have for snack? ");
System.out.println(" A: " + myMealMap.get(MealType.SNACK));
System.out.println(" Q: What should I have for dinner? ");
System.out.println(" A: " + myMealMap.get(MealType.DINNER));
// Iterate over enumMap
for (MealType mealType : myMealMap.keySet()) {
System.out.println(myMealMap.get(mealType));
}
System.out.println("*** Checking for concurrent modification exception! ***");
// Does not throw Concurrent modification Exception in enumMap
for (MealType mealType : myMealMap.keySet()) {
if (MealType.SNACK.equals(mealType)) {
myMealMap.remove(MealType.SNACK);
}
}
// map changed without throwing Concurrent modification Exception
System.out.println(myMealMap);
}
}
有人能告诉我为什么它是防故障的吗?
您可以在EnumMap.java源代码和注释中看到集合视图返回的迭代程序是弱一致的:它们将永远不会抛出ConcurrentModificationException,并且它们可能会也可能不会显示迭代进行时对映射进行的任何修改的效果。
EnumMap性能原因中给出的另一个方面