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

相关推荐
zhanghaha131441 分钟前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
白狐_7981 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2581 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅2 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
qq_448011162 小时前
C语言中的动态内存分配
c语言·开发语言·php
汉字萌萌哒3 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter3 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
极创信息3 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒4 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院4 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi