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

相关推荐
杨了个杨89824 分钟前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
kaikaile19959 分钟前
数字全息图处理系统(C# 实现)
开发语言·c#
秋91 小时前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
huangdong_2 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育2 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
chase_my_dream2 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
snow@li3 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
Cloud_Shy6183 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
云烟成雨TD3 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework3 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java