java.lang.Object
java.lang.Enum<E>
一、枚举特性:
1、枚举类型enum和类class、接口interface的级别是一样的,关键字enum;
2、定义的每个枚举类型都继承自java.lang.Enum类;
3、枚举中可以定义枚举值(枚举成员)和方法(包括构造方法);
4、枚举成员是public、final、static修饰的,每个枚举成员实际是枚举的实例。
举例1:
在class中调用枚举值。
public enum Color
{
Red,White, Blue;// 定义了3个枚举值。最后可以加分号,也可以不加分号,两个枚举值之间用逗号隔开
}
调用方式为: 枚举名称.成员名称,例如 Color.Red,可以在类中调用枚举值。例如:
public class EnumTest
{
public static void main(String[] args)
{
System.out.println(Color.Blue);
}
}
结果为:Blue
举例2:
利用枚举中定义的静态方法,遍历枚举值。
枚举中给出了2个静态方法:
public static <T extends Enum<T>> T values() 得到枚举值的数组
public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name)
根据values()方法,遍历枚举值:
enum Color
{
Red,Blue,Black,White
}
public class EnumTest
{
public static void main(String[] args)
{
for(Color c : Color.values())
{
System.out.println(c);
}
}
}
结果(打印顺序按照枚举中定义的 顺序):
Red
Blue
Black
White
举例3:
在类中使用switch...case函数调用枚举值,switch后可以跟的数据类型有5种:char、byte、short、int、enum。
enum Operation
{
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
public class EnumTest
{
public static void main(String[] args)
{
EnumTest.operation(Operation.TURN_LEFT);
}
public static void operation(Operation operation)
{
switch(operation)
{
case TURN_LEFT:
System.out.println("左转");
break;
case TURN_RIGHT:
System.out.println("右转");
break;
case SHOOT:
System.out.println("射击");
break;
}
}
}
结果:左转
举例4:
①在枚举中定义构造方法、一般方法。
enum Name
{
LPP("lpp"),FGS("fgs"),LILY("lily");//枚举值为枚举的实例,其表现形式和构造函数一致:枚举构造函数中传入String类型的字符串,则枚举值也应传入String类型的字符串
//LPP,FGS,LILY;//此句出错,是因为不带参数的构造函数已经被重写
private String s;
Name(String s)//此处不允许使用public
{
this.s = s;
}
public String getS()
{
return s;
}
}
class EnumTest1
{
public static void main(String[] args)
{
Name name = Name.LPP;
System.out.println(name.getS());
}
}
结果:lpp
②在枚举中只定义一般方法,默认无参构造方法。
enum Name
{
LPP,FGS,LILY;
//LPP("lpp"),FGS("fgs"),LILY("lily");//默认为无参构造方法,因此实例中不能传入任何类型的参数
private String s;
public void setS(String s)
{
this.s = s;
}
public String getS()
{
return s;
}
}
class EnumTest1
{
public static void main(String[] args)
{
Name name = Name.LPP;
name.setS("lpp");
System.out.println(name.getS());
}
}
结果:lpp
二、枚举集合EnumSet
java.lang.Object java.util.AbstractCollection<E> java.util.AbstractSet<E> java.util.EnumSet<E> EnumSet属于java.util包,Enum属于java.lang包
public abstract class EnumSet<E extends Enum<E>> EnumSet为抽象类,泛型为Enum或继承Enum的类型 extends AbstractSet<E> implements Cloneable, Serializable
EnumSet中的方法介绍:
方法摘要 | ||
---|---|---|
static
| allOf(Class<E> elementType) 创建一个包含指定元素类型的所有元素的枚举 set。 |
static
| complementOf(EnumSet<E> s) 创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含指定 set 中所不 包含的此类型的所有元素。 |
static
| noneOf(Class<E> elementType) 创建一个具有指定元素类型的空枚举 set。 | |
static
| of(E e) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E first, E... rest) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2, E e3) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2, E e3, E e4) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2, E e3, E e4, E e5) 创建一个最初包含指定元素的枚举 set。 |
abstract Iterator<E> | iterator() 返回在此 collection 中的元素上进行迭代的迭代器。 |
从EnumSet的方法定义中看出,和TreeSet、HashSet差别很大。EnumSet没有构造函数,因此不好用new进行实例化。可借助allOf()、noneOf()、of()方法得到一个含有特定枚举类型的枚举元素的集合。
举例:
import java.util.*;enum Name{LPP,FGS,LILY;}class EnumTest1 {public static void main(String[] args) {EnumSet<Name> enumset = EnumSet.of(Name.LPP,Name.FGS);//创建一个包含枚举值LPP和FGS的枚举集合,传入的参数必须是Name类型的EnumTest1.print(enumset);
EnumTest1.print(EnumSet.complementOf(enumset));//complementOf的方法表示当前类型中所有元素除去enumset中的所有元素}public static void print(EnumSet<Name> enumset) {for(Iterator<Name> iter = enumset.iterator();iter.hasNext();)//通过迭代器遍历枚举集合{System.out.println(iter.next());}}}
结果:
三、枚举集合EnumMap
java.lang.Object java.util.AbstractMap<K,V> java.util.EnumMap<K,V> Enum属于java.lang包,EnumMap属于java.util包
public class EnumMap<K extends Enum<K>,V> EnumMap不是抽象类
extends AbstractMap<K,V> implements Serializable, Cloneable
EnumMap的构造方法、一般方法
构造方法摘要 | |
---|---|
EnumMap(Class<K> keyType)
创建一个具有指定键类型的空枚举映射。 | |
EnumMap(EnumMap<K,?
extends V> m) 创建一个其键类型与指定枚举映射相同的枚举映射,最初包含相同的映射关系(如果有的话)。 | |
EnumMap(Map<K,?
extends V> m) 创建一个枚举映射,从指定映射对其初始化。 |
V | get(Object key)
返回此映射将指定键映射到的值,如果此映射不包含指定键的映射关系,则返回 null。 |
Set<K> | keySet()
返回此映射中所包含键的 Set 视图。 |
Set<Map.Entry<K,V>> | entrySet()
返回此映射中所包含映射关系的 Set 视图。 |
举例:
import java.util.*;
enum Operation
{
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
class EnumMapTest
{
public static void main(String[] args)
{
EnumMap<Operation, String> enummap = new EnumMap<Operation, String>(Operation.class);
enummap.put(Operation.TURN_LEFT,"左转");
enummap.put(Operation.TURN_RIGHT,"右转");
enummap.put(Operation.SHOOT,"射击");
System.out.println("--------增强for循环遍历----------");
for(Operation op : Operation.values())
{
System.out.println(op +": " +enummap.get(op));
}
System.out.println("--------迭代器遍历----------");
Set<Map.Entry<Operation, String>> set= enummap.entrySet();
for(Iterator<Map.Entry<Operation, String>> iter = set.iterator(); iter.hasNext(); )
{
Map.Entry<Operation, String> me = iter.next();
Operation oper = me.getKey();
String str = me.getValue();
System.out.println(oper +": " +str);
}
}
}
结果:
小结:从上述示例中可以看出EnumMap和HashMap、TreeMap的使用方式是一样的。