目录
定义
枚举是一个特殊的类,一般表示一组常量,比如一年的4个季节,一年的12月份,方向的东南西北等
声明
使用enum关键字来定义,各个常量使用逗号,来分割例如:
enum Color{
RED,GREEN,BLUE
}
public class Test
{
// 执行输出结果
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
枚举类
枚举类也可以在内部声明
枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它
for语句中迭代枚举元素
enum Color
{
RED, GREEN, BLUE;
}
public class MyClass {
public static void main(String[] args) {
for (Color myVar : Color.values()) {
System.out.println(myVar);
}
}
}
switch语句中使用枚举类
enum Color{
RED,GREEN,BLUE
}
public class MyClass{
public static void main(String[]args){
Color myVar = Color.BLUE;
switch(myVar){
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
break;
}
}
}
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
EnumMap
Map接口的实现,其key-value映射中的key是Enum类型;
其原理就是一个对象数组,数组的下标索引就是根据Map中的key直接获取,即枚举中的ordinal值;
效率比HashMap高,可以直接获取数组下标索引并访问到元素;
package com.exercise;
import java.util.EnumMap;
import java.util.Map;
import java.util.Map.Entry;
enum Operate{
ADD, UPDATE, DELETE;
}
public class Main {
public static void main(String[] args) {
Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);
//put方法
map.put(Operate.ADD, "add operate");
map.put(Operate.UPDATE, "update operate");
map.put(Operate.DELETE, "delete operate");
//重写了toString方法
System.out.println(map);
//size方法
System.out.println(map.size());
System.out.println(map.containsKey(Operate.UPDATE));
System.out.println(map.containsValue("update operate"));
System.out.println(map.get(Operate.DELETE));
//remove
map.remove(Operate.UPDATE);
System.out.println(map);
//key集合
for(Operate operate:map.keySet()){
System.out.print(operate + " ");
}
System.out.println();
//value集合
for(String obj:map.values()){
System.out.print(obj + ",");
}
System.out.println();
//key-value集合
for(Entry<Operate, String> entry:map.entrySet()){
System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
}
}
}
运行结果
{ADD=add operate, UPDATE=update operate, DELETE=delete operate}
3
true
true
delete operate
{ADD=add operate, DELETE=delete operate}
ADD DELETE
add operate,delete operate,
ADD: add operate, DELETE: delete operate,
EnumSet
通过结果可以看出ArrayList内放置的元素可以重复,而EnumSet内放置的元素不重复
是一个用来操作Enum的集合,是一个抽象类,它有两个继承类:JumboEnumSet和RegularEnumSet。在使用的时候,需要确定枚举类型。它的特点也是速度非常快,为什么速度很快呢?因为每次add的时候,每个枚举值只占一个长整型的一位。
enum Season {
SPRING, SUMMER, FALL, WINTER
}
public class EnumSetTest {
public static void main(String[] args) {
//创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值 //EnumSet.allOf()创建一个满的set
EnumSet es1 = EnumSet.allOf(Season.class);
//输出[SPRING, SUMMER, FALL, WINTER]
System.out.println(es1);
//创建一个EnumSet空集合,指定其集合元素是Season类的枚举值
EnumSet es2 = EnumSet.noneOf(Season.class);
//输出[]
System.out.println(es2);
//手动添加两个元素
es2.add(Season.WINTER);
es2.add(Season.SPRING);
//输出[Spring, WINTER]
System.out.println(es2);
//以指定枚举值创建EnumSet集合
EnumSet es3 = EnumSet.of(Season.SUMMER, Season.WINTER);
//输出[SUMMER, WINTER]
System.out.println(es3);
//创建一个包含两个枚举值范围内所有枚举值的EnumSet集合(创建指定范围set使用EnumSet.range方法)
EnumSet es4 = EnumSet.range(Season.SUMMER, Season.WINTER);
//输出[SUMMER, FALL, WINTER]s
System.out.println(es4);
//新创建的EnumSet集合元素和es4集合元素有相同的类型
//es5集合元素 + es4集合元素=Season枚举类的全部枚举值
EnumSet es5 = EnumSet.complementOf(es4);//补集EnumSet.complementOf创建set
System.out.println(es5);
//创建一个集合
Collection c = new HashSet();
c.clear();
c.add(Season.SPRING);
c.add(Season.WINTER);
//复制Collection集合中的所有元素来创建EnumSet集合
EnumSet es = EnumSet.copyOf(c);
//输出es
System.out.println(es);
c.add("111");
c.add("222");
//下面代码出现异常,因为c集合里的元素不是全部都为枚举值
es = EnumSet.copyOf(c);
}
}
使用场景
1.作为普通的常量使用,如星期、季节、颜色、城市等等;通常配合switch语句使用
2.往枚举中添加变量、构造函数、以达到灵活获取指定值的目的(注: Java 要求必须先定义 enum 实例,否则编译会报错);通常用于一些业务系统中定义一些固定值,如用于匹配db中的字段值等,发现最近代码中的一些常量可以使用这种方法来替换
3.往枚举中添加自己特定方法,以实现自己所需的相关业务逻辑
4.其它用法,java中的枚举还有许多其它的用法,如重写toString()、equals()等方法,实现接口、枚举Map等等
标签:Java,--,System,EnumSet,枚举,println,operate,out From: https://www.cnblogs.com/yangcurry/p/18383914