EnuMap介绍
EnumMap
的类定义为:
Class EnumMap<K extends Enum<K>,V>
其中K extends Enum<K>
代表的是enum
枚举类。EnumMap
是将枚举类型作为Key
的Map
的特殊实现。Map
有着弱一致性,这意味着迭代时如果对集合进行修改不会抛出ConcurrentModificationException
异常,但是迭代时进行的修改对迭代本身是不可见的。EnumMap
的key
不能为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介绍:
EnumSet
是Set
针对枚举类型的特殊实现,其内部是以比特向量表示的,因此在插入,删除和比较操作上都是非常快速的,甚至批量操作也是非常快速的(比如containsAll
和retainAll
)。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);