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

相关推荐
鼠鼠龙年发大财18 分钟前
fly专享
开发语言·php
hunandede22 分钟前
直播相关02-录制麦克风声音,QT 信号与槽,自定义信号和槽
开发语言·qt
lzb_kkk1 小时前
【Redis】redis5种数据类型(哈希)
开发语言·redis·算法·缓存·哈希算法
易雪寒1 小时前
Maven从入门到精通(二)
java·maven
易雪寒1 小时前
Maven从入门到精通(三)
java·python·maven
AskHarries1 小时前
maven父子工程多模块如何管理统一的版本号?
java·spring boot·后端·maven
码农娟2 小时前
hutool 集合相关交集、差集
java
Good_tea_h2 小时前
如何实现Java中的多态性
java·开发语言·python
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐-项目评审系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
格林威2 小时前
Baumer工业相机堡盟工业相机如何通过BGAPISDK使用短曝光功能(曝光可设置1微秒)(C语言)
c语言·开发语言·人工智能·数码相机·计算机视觉