Разберитесь с EnumMap и EnumSet в одной статье

Java

Разберитесь с 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