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

相关推荐
酷爱码32 分钟前
如何通过python连接hive,并对里面的表进行增删改查操作
开发语言·hive·python
画个大饼33 分钟前
Go语言实战:快速搭建完整的用户认证系统
开发语言·后端·golang
喵先生!2 小时前
C++中的vector和list的区别与适用场景
开发语言·c++
Nelson_hehe2 小时前
Java基础第四章、面向对象
java·语法基础·面向对象程序设计
Thomas_YXQ2 小时前
Unity3D Lua集成技术指南
java·开发语言·驱动开发·junit·全文检索·lua·unity3d
xMathematics3 小时前
计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形
开发语言·c++·qt·计算机图形学·cmake·opengl
ShiinaMashirol3 小时前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
东阳马生架构5 小时前
Nacos简介—3.Nacos的配置简介
java
yuanManGan5 小时前
C++入门小馆: 深入了解STLlist
开发语言·c++
北极的企鹅885 小时前
XML内容解析成实体类
xml·java·开发语言