Необходимость EnumSet / EnumMap в обобщенном наборе / карте - PullRequest
0 голосов
/ 09 ноября 2018

EnumSet/EnumMap можно создать, указав определенное перечисление для создания экземпляра set / map, как показано в примере кода ниже.

Пока я читал, разница между EnumSet/EnumMap и Set / Map состоит в том, что мы не можем добавлять объекты, отличные от Enum в EnumSet/EnumMap. Если дело обстоит именно так, то достаточно будет только самого обобщенного набора / карты, не так ли?

Найдите EnumSet/EnumMap и их соответствующие обобщенные Set/Map следующим образом:

enum Value {
    VALUE_1, VALUE_2, VALUE_3
};

public class Sample {   
    public static void main(String args[]) {
        EnumSet<Value> enumSet = EnumSet.of(Value.VALUE_1);

        Set<Value> enumGenerifiedSet = new HashSet<Value>();
        enumGenerifiedSet.add(Value.VALUE_1);

        EnumMap<Value, Integer> enumMap = new EnumMap<Value, Integer>(Value.class);
        enumMap.put(Value.VALUE_1, 1);

        Map<Value, Integer> enumGenerifiedMap = new HashMap<Value, Integer>();
        enumGenerifiedMap.put(Value.VALUE_1, 1);
    }
}

Итак, не могли бы вы сказать мне, для чего нужно иметь EnumSet/EnumMap, хотя мы можем создать набор / карту, которая генерируется для определенного Enum?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Интерфейсы практически идентичны.Тем не менее, производительность и основные механизмы совершенно разные.

Документация довольно ясна по этому вопросу:

Наборы перечислений представляются внутри как битовые векторы.Это представление чрезвычайно компактно и эффективно.Пространственно-временные характеристики этого класса должны быть достаточно хорошими, чтобы его можно было использовать в качестве высококачественной, безопасной для типов альтернативы традиционным основанным на int «битовым флагам».Даже массовые операции (такие как containsAll и retainAll) должны выполняться очень быстро, если их аргумент также является набором перечислений.

[...]

null элементы не являютсяразрешенный.Попытки вставить элемент null приведут к NullPointerException.Попытки проверить наличие элемента null или удалить его, тем не менее, будут работать правильно.

[...]

Примечание по реализации: Все основные операции выполняются в постоянное время, Вероятно, что они (хотя и не гарантированы) будут намного быстрее, чем их HashSet аналоги. Даже массовые операции выполняются в постоянное время, если их аргумент также является набором перечисления.

java.util.EnumSet, JDK 11

...