和枚举相关的集合类
在JDK 1.5的java.util 程序包中提供两个新的集合操作类: EnumMap 和EnumSet,这两个类与枚举类型的结合应用可使以前非常繁琐的程序变得简单方便。 EnumSet类提供了java.util.Set接口的一个特殊实现,而EnumMap类提供了java.util.Map接口的一个特殊实现,该类中的键(key)是一个枚举类型。
EnumMap
EnumMap是Map接口的子类,所以本身还是以Map的形式进行操作,即:key -> value。如果要想使用EnumMap,则首先要创建EnumMap的对象,在创建此对象的时候必须指定要操作的枚举类型,所以构造方法如下所示:
public EnumMap(Class<K> keyType)
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。
EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。
EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)来维护来维护key-value对的次序。当程序通过keySet()、entrySet()、values()等方法来遍历EnumMap时即可看到这种顺序。
EnumMap不允许使用null作为key值,但允许使用null作为value。如果试图使用null作为key将抛出NullPointerException异常。如果仅仅只是查询是否包含值为null的key、或者仅仅只是使用删除值为null的key,都不会抛出异常。
示例:
public class EnumMapDemo {
public static void main(String[] args) {
Map<Color, String> map = new EnumMap<Color, String>(Color.class);
map.put(Color.RED, "红色");
map.put(Color.GREEN, "绿色");
map.put(Color.BLUE, "蓝色");
System.out.println("输出全部的枚举:");
for(Color c : Color.values()){//取得全部的枚举
System.out.println(c.name() + "-->" + map.get(c));
}
System.out.println("输出全部的键值:");
for(Color c : map.keySet()){//取得全部的key,key是Color类型的
System.out.println(c.name());
}
System.out.println("输出全部的内容:");
for(String s : map.values()){//取得全部value
System.out.println(s);
}
}
}
enum Color{
RED, GREEN, BLUE;
}
以上是直接使用EnumMap的方式,此时EnumMap允许插入各种类型的值。由于java自动包装机制,甚至可以插入整数等基本类型。下面的是继承EnumMap类的方式,如果向其中插入无关类型则编译报错,此种方法避免了类型安全的问题。
public class ColorMap extends EnumMap<Color, String> {
public ColorMap() {
super(Color.class);
}
}
EnumSet
EnumSet是Set接口的子类,所以里面的内容是无法重复的。它有两个继承类:JumboEnumSet和RegularEnumSet。
EnumSet是一个抽象类,在使用EnumSet的时候是不能直接使用关键字new为其进行实例化的,所以在此类中提供了很多的静态方法。
实例:
public class EnumSetDemo {
public static void main(String[] args) {
//将枚举的全部类型设置到EnumSet对象之中
EnumSet<Color> es1 = EnumSet.allOf(Color.class);
print(es1);
//只设置一个枚举的类型到集合之中
EnumSet<Color> es2 = EnumSet.of(Color.BLUE);
print(es2);
//创建只能放入Color类型的对象
EnumSet<Color> es3 = EnumSet.noneOf(Color.class);
es3.add(Color.RED);
es3.add(Color.BLUE);
print(es3);
//创建一个不包含指定元素的集合
EnumSet<Color> es4 = EnumSet.complementOf(es3);
print(es4);
//从已有的集合中拷贝出内容
EnumSet<Color> es5 = EnumSet.copyOf(es3);
print(es5);
}
public static void print(EnumSet<Color> es){
for(Color c : es){
System.out.print(c + " ");
}
System.out.println();
}
}
enum Color{
RED, GREEN, BLUE; //定义枚举的三个类型
}