java基础之枚举Enum

1、基础入门:

1.1:枚举,从名称可知数据量一定是有限的,可列举的。

1.2枚举常见使用: (1)单个值 (2) K-V 进行值的转换。

java 复制代码
public enum ColorEnum {
    RED, GREEN, YELLOW;
}

public enum CodeEnum {
    One("1", "one"),
    Two("2", "two");
    private String code;
    private String msg;

    CodeEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

1.3 枚举常见方法:

  • name():返回实例名。
java 复制代码
 //注意: 该变量和方法均使用final进行修饰
  private final String name;

  public final String name() {
        return name;
    }
  • ordinal():返回实例声明时的次序,从0开始。
java 复制代码
	private final int ordinal;  //注意: 该变量和方法均使用final进行修饰
	 public final int ordinal() {
	     return ordinal;
	}
  • equals():判断是否为同一个对象,默认是进行地址比较。
java 复制代码
    public final boolean equals(Object other) {
        return this==other;
    }
  • compareTo(): 枚举值进行比较,实际比较的是对象ordinal值。
java 复制代码
   public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }
  • values(): 返回 enum 实例的数组,而且该数组中的元素严格保持在 enum 中声明时的顺序。
  • valueOf():根据实例名称获取指定实例对象

疑问: 可以发现 values()、valueOf()方法并自定义的枚举类或者Enum类中,这两个方法来自哪里 ?

2、深入学习

带着上述疑问,反编译如下代码:

java 复制代码
public enum CodeEnum {
    One("1", "one"),
    Two("2", "two");
    private String code;
    private String msg;

    CodeEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

代码反编译后在编译结果:

java 复制代码
public final class CodeEnum extends Enum{
    
    public static final CodeEnum One;
    public static final CodeEnum Two;
	private static final CodeEnum $VALUES[];
	
    static  {
        One = new CodeEnum("One", 0, "1", "one");
        Two = new CodeEnum("Two", 1, "2", "two");
        $VALUES = (new CodeEnum[] {
            One, Two
        });
    }

    public static CodeEnum[] values() {
        return (CodeEnum[])$VALUES.clone();
    }

    public static CodeEnum valueOf(String s) {
        return (CodeEnum)Enum.valueOf(com/ztest/CodeEnum, s);
    }
    
    private String code;
    private String msg;
    
    private CodeEnum(String s, int i, String s1, String s2) {
        super(s, i);
        code = s1;
        msg = s2;
    }
}

通过反编译可以发现:

1、自定义枚举默认被final 修饰,因此不可以被继承;

2、自定义枚举默认继承Enum类,由于java是单继承,因此不可再继承其他类;

3、使用对象数组存储枚举实例对象,且会按照对象声明顺序给对象进行编号,编号不可修改( private final int ordinal)。

4、枚举的构造方法,再执行时会增加两个参数

  • 实例名称
  • 顺序

5、会自动增加两个静态方法

  • values() ;
  • valueOf(String s) ;

3、EnumSet和EnumMap

  • EnumSet是枚举类型的高性能 Set实现。它要求放入它的枚举常量必须属于同一枚举类型。
  • EnumMap是专门为枚举类型量身定做的 Map实现。虽然使用其它的 Map 实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用 EnumMap 会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值。这使得 EnumMap 的效率非常高。

3.1 EnumSet:

java 复制代码
EnumSet<CodeEnum> enumSet = EnumSet.allOf(CodeEnum.class);

--->
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
      EnumSet<E> result = noneOf(elementType);
      result.addAll();
      return result;
  }
  
--->
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }

使用EnumSet时 底层使用RegularEnumSet 或者JumboEnumSet实现,待续...

3.2 EnumMap

java 复制代码
EnumMap<CodeEnum, String> cMap = new EnumMap(CodeEnum.class);
cMap .put(CodeEnum.Two, "这是2");

待续...

参考文章: 文章1

相关推荐
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck1 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei1 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师2 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616883 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端