Разберитесь с EnumMap и EnumSet в одной статье
Введение
Вообще говоря, мы выберем использование HashMap для хранения данных в формате ключ-значение. Учитывая такой особый случай, ключи HashMap поступают из класса Enum. В таком случае вы можете рассмотреть возможность использования EnumMap, который будет обсуждаться в эта статья.
EnumMap
Давайте посмотрим на сравнение между определением EnumMap и определением HashMap:
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>
implements java.io.Serializable, Cloneable
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
Мы видим, что EnumMap почти такой же, как HashMap, разница в том, что ключ EnumMap является Enum.
Вот простой пример использования:
Сначала определите Enum:
public enum Types {
RED, GREEN, BLACK, YELLO
}
Давайте посмотрим, как использовать EnumMap:
@Test
public void useEnumMap(){
EnumMap<Types, String> activityMap = new EnumMap<>(Types.class);
activityMap.put(Types.BLACK,"black");
activityMap.put(Types.GREEN,"green");
activityMap.put(Types.RED,"red");
}
Другие операции на самом деле аналогичны hashMap, поэтому мы не будем говорить об этом здесь.
Когда использовать EnumMap
Потому что в EnumMap все возможные значения ключей известны при их создании, поэтому использование EnumMap может повысить эффективность по сравнению с hashMap.
В то же время, поскольку ключ относительно прост, EnumMap не нужно учитывать в реализации некоторые сложные ситуации, подобные HashMap.
EnumSet
Подобно EnumMap, EnumSet представляет собой набор, и все элементы в наборе относятся к типу Enum.
EnumSet — это абстрактный класс, и для создания класса EnumSet можно использовать два статических метода, предоставляемых EnumSet: noneOf и allOf.
Сначала посмотрите на noneOf:
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
noneOf проходит в класс Enum и возвращает пустой EnumSet типа Enum.
Из приведенного выше кода видно, что EnumSet имеет две реализации: JumboEnumSet используется, когда длина больше 64, и RegularEnumSet используется, когда длина меньше 64.
Обратите внимание, что JumboEnumSet и RegularEnumSet не рекомендуются для прямого использования, они используются внутри.
Взгляните еще раз на allOf:
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
EnumSet<E> result = noneOf(elementType);
result.addAll();
return result;
}
allOf очень прост, сначала вызовите noneOf, чтобы создать пустой набор, а затем вызовите метод addAll, чтобы добавить в него все элементы.
Суммировать
EnumMap и EnumSet оптимизированы для конкретных объектов Enum и могут использоваться там, где это необходимо.
Примеры этой статьиGitHub.com/Dadean2009/приходите…
Добро пожаловать, обратите внимание на мой публичный номер: вас ждут самые интересные вещи о программе! Для получения дополнительной информации, пожалуйста, посетитеwww.flydean.com