一、概述
关键字enum可以将一组具名的值IDE有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。所有的枚举类型都会继承java.lnag.Enum。点击查看Enum常用方法。所有的枚举类型都不能被继承。
二、一个简单的示例
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
private String name;
private int index;
Color(String name, int index) {
this.name = name;
this.index = index;
}
/**
* values() 获取一个枚举数组
* 通过索引获取值
*/
public static String getName(int index) {
for(Color color : Color.values()) {
if (color.index == index) {
return color.name;
}
}
return null;
}
/**
* ordinal() 获取枚举放入的顺序
* 通过名字获取放入的顺序
*/
public static int getOrdinal(String name) {
for(Color color : Color.values()) {
if (color.name == name) {
return color.ordinal();
}
}
return -1;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
}
public class EnumDemo {
public static void main(String[] args) {
Color c = Color.GREEN;
System.out.println("名称:" + c.getName() + ";编号: " + c.getIndex());
System.out.println(c.name());
System.out.println(Color.getOrdinal(c.getName()));
}
}
三、EnumSet
Set与枚举类型一起使用的专用实现。枚举集中的所有元素必须来自单个枚举类型,该类型在创建集时显式或隐式指定。枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的“位标志” 的高质量,类型安全的替代品。如果它们的参数也是枚举集,即使批量操作(例如containsAll和retainAll)也应该非常快速地运行。
迭代器方法返回的迭代器以其自然顺序(枚举常量声明的顺序)遍历元素。返回的迭代器是弱一致的:它永远不会抛出ConcurrentModificationException ,它可能会也可能不会显示迭代进行过程中对集合所做的任何修改的影响。
不允许使用空元素。尝试插入null元素将抛出NullPointerException。但是,尝试测试null元素的存在或删除一个元素将正常工作。
与大多数集合实现一样,EnumSet不同步。如果多个线程同时访问枚举集,并且至少有一个线程修改了该集,则应该在外部进行同步。这通常通过在自然封装枚举集的某个对象上进行同步来实现。如果不存在此类对象,则应使用该Collections.synchronizedSet(java.util.Set) 方法“包装”该集合。这最好在创建时完成,以防止意外的不同步访问:
设置<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
实施说明:所有基本操作都在恒定时间内执行。它们很可能(虽然不能保证)比HashSet同行快得多 。如果它们的参数也是枚举集,即使批量操作也会在恒定时间内执行。
此类是 Java Collections Framework的成员 。
-
EnumSet使用示例
public static void main(String[] args) {
EnumSet<Color> eColors = EnumSet.allOf(Color.class);
for(Color color : eColors) {
System.out.println("name: " + color.getName() + "\tindex: " + color.getIndex());
}
}
四、EnumMap
Map与枚举类型键一起使用的专用实现。枚举映射中的所有键必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表现非常紧凑和高效。
枚举映射按其键的自然顺序(枚举常量的声明顺序)维护。这反映在由集合视图返回的迭代(keySet(), entrySet(),和values())。
集合视图返回的迭代器非常一致:它们永远不会抛出ConcurrentModificationException,它们可能会也可能不会显示迭代进行过程中对映射所做的任何修改的影响。
不允许使用空密钥。尝试插入空键将抛出NullPointerException。但是,尝试测试是否存在空键或删除空键将正常运行。允许空值。
与大多数集合实现一样,EnumMap不同步。如果多个线程同时访问枚举映射,并且至少有一个线程修改了映射,则应该在外部进行同步。这通常通过在自然封装枚举映射的某个对象上同步来完成。如果不存在此类对象,则应使用该Collections.synchronizedMap(java.util.Map<K, V>) 方法“包装”地图。这最好在创建时完成,以防止意外的不同步访问:
Map <EnumKey,V> m = Collections.synchronizedMap(new EnumMap <EnumKey,V>(...));
实施说明:所有基本操作都在恒定时间内执行。它们很可能(虽然不能保证)比HashMap执行更快 。
此类是 Java Collections Framework的成员 。
-
EnumMap使用示例
public static void main(String[] args) {
EnumMap<Color, String> weekMap = new EnumMap<Color, String>(Color.class);
weekMap.put(Color.BLANK, "白色");
weekMap.put(Color.GREEN, "绿色");
// ... ...
for (Iterator<Entry<Color, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
Entry<Color, String> entry = iter.next();
System.out.println(entry.getKey().name() + ":" + entry.getValue());
}
}