Java--枚举类型

yangcurry / 2024-08-28 / 原文

目录
  • 定义
  • 声明
  • 枚举类
      • EnumMap
      • EnumSet
  • 使用场景

定义

枚举是一个特殊的类,一般表示一组常量,比如一年的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等等