java EnumMap和EnumSet

EnuMap介绍

EnumMap的类定义为:

Class EnumMap<K extends Enum<K>,V>

其中K extends Enum<K>代表的是enum枚举类。EnumMap是将枚举类型作为KeyMap的特殊实现。Map有着弱一致性,这意味着迭代时如果对集合进行修改不会抛出ConcurrentModificationException异常,但是迭代时进行的修改对迭代本身是不可见的。EnumMapkey不能为null,但是value可以为null
定义如下枚举类型:

enum City {
    BEIJING("BeiJing"),
    SHANGHAI("ShangHai"),
    TIANJIN("TianJin"),
    SHENZHEN("ShenZhen");
    private final String value;
    City(String value) {
        this.value = value;
    }
    public String getCityName() {
        return this.value;
    }
}

则可以创建对应的EnumMap对象并进行操作:

Map<City, Integer> map = new EnumMap<>(City.class);
map.put(City.SHENZHEN, 1);
map.computeIfAbsent(City.BEIJING, Object::hashCode);

EnumMap不是线程安全的,因此如果有多个线程对同一EnumMap对象进行操作时会出现冲突,但是可以使用Collections.synchronizedMap(new EnumMap(...))包装类将EnumMap改造成一个可以同步的Map
在对EnumMap中的元素进行迭代时,keySet()entrySet()values()方法返回的元素顺序都是以键的自然顺序进行排列的。

EnumSet介绍:

EnumSetSet针对枚举类型的特殊实现,其内部是以比特向量表示的,因此在插入,删除和比较操作上都是非常快速的,甚至批量操作也是非常快速的(比如containsAllretainAll)。
EnumSet也不是线程安全的。EnumSet并不能通过构造方法创建对象,相应的EnumSet提供了一些静态方法用于创建EnumSet的实例:

// 创建EnumSet对象,含有City中的所有值;
Set<City> set1 = EnumSet.allOf(City.class);
// 创建EnumSet对象,不含有City中的任何值:
Set<City> set2 = EnumSet.noneOf(City.class);
// 创建EnumSet对象,其中的元素与传入的EnumSet互斥
Set<City> set3 = EnumSet.complementOf((EnumSet<City>) set2);
// 创建EnumSet对象,其中的元素与传入的EnumSet对象中的元素一致
Set<City> set4 = EnumSet.copyOf((EnumSet<City>) set);
// 创建EnumSet对象,其中只含有City.BEIJING这一个元素
Set<City> set5 = EnumSet.of(City.BEIJING);
// 创建EnumSet对象,其中含有元素City.BEIJING,City.SHANGHAI,City.SHENZHEN这三个元素
Set<City> set6 = EnumSet.of(City.BEIJING, City.SHANGHAI, City.SHENZHEN);
上一篇:react源码解析14.手写hooks


下一篇:最近肆虐传播的.beijing后缀勒索病毒是什么?文件被加密为.beijing后缀能否恢复?