0

私は 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);

}

  }

フェイルセーフである理由を教えてもらえますか?

4

1 に答える 1

1

EnumMap.java のソースと、コレクション ビューによって返されるイテレータの一貫性が弱いことをコメントで確認できます。それらはConcurrentModificationException をスローすることはなく、イテレーションの進行中に発生するマップへの変更の影響を示す場合と示さない場合があります。 .

EnumMap Performance Reasonで指定されたもう 1 つの側面

于 2015-02-27T06:18:38.033 に答える