JDK5.0新特性:枚举类型enum、枚举集合EnumSet、枚举映射EnumMap

本文详细介绍了JDK5.0引入的枚举特性,包括枚举类型作为类和接口的等价物,枚举成员的属性与调用方式,以及如何在枚举中定义构造方法和一般方法。同时,文章还探讨了枚举集合EnumSet的创建和遍历,以及枚举映射EnumMap的使用,展示了它们与传统集合的区别和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
<E extends Enum<E>> EnumSet<E>
allOf(Class<E> elementType)           创建一个包含指定元素类型的所有元素的枚举 set。

static
<E extends Enum<E>> EnumSet<E>
complementOf(EnumSet<E> s)           创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含指定 set 中所 包含的此类型的所有元素。
static
<E extends Enum<E>> EnumSet<E>
noneOf(Class<E> elementType)           创建一个具有指定元素类型的空枚举 set。
static
<E extends Enum<E>> EnumSet<E>
of(E e)           创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>> EnumSet<E>
of(E first, E... rest)           创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>> EnumSet<E>
of(E e1, E e2)           创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>> EnumSet<E>
of(E e1, E e2, E e3)           创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>> EnumSet<E>
of(E e1, E e2, E e3, E e4)           创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>> EnumSet<E>
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)           创建一个枚举映射,从指定映射对其初始化。
一般方法:

 
 Vget(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的使用方式是一样的。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值