首页 > 其他分享 >2023年6月3日,枚举,枚举底层实现

2023年6月3日,枚举,枚举底层实现

时间:2023-06-04 18:02:04浏览次数:42  
标签:info String Season name 枚举 2023 public 底层

1. 枚举

1. 枚举

枚举是一种受限制的类,枚举第一行必须创建对象,枚举不能显示继承父类(枚举没有父类),所有的自定义枚举类默认继承Enum类

package com.wz.enum01;

public enum  Season {
    spring("春天","春雨绵绵"),
    summer("夏天","烈日炎炎"),
    autumn("秋天","硕果累累"),
    winter("冬天","寒风凌冽")
    ;
    private String name;
    private String info;
    private Season(){

    }

    private Season(String name, String info) {
        this.name = name;
        this.info = info;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return this.name+":"+this.info;
    }
}
package com.wz.enum01;

public class test01 {
    /**
     * 知识点:枚举
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
    }
}

2023年6月3日,枚举,枚举底层实现_枚举类

2. 枚举的特点

  • 枚举就是一个受限制的类,默认继承Enum
  • 枚举的第一行必须定义该枚举类型的对象
  • 枚举类型对象默认添加: public static final 类型
  • 枚举没有继承明确类(自定义枚举类默认继承Enum,Enum默认继承Object)
  • 枚举类不能被继承
  • 枚举里可以有构造方法、成员方法、静态方法、抽象方法
  • 枚举可以实现接口
  • 枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加

3. 枚举的优势

  • 增强代码可读性
  • 枚举型可直接与数据库交互
  • switch语句优势
  • 编译优势

(枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类 )

  • 将常量组织起来,统一管理
  • 去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高

2.枚举方法

1. 枚举方法

方法名

解释

Enum.valueOf(Class enumType, String name)

根据字符串找到该枚举类中的对象

public static void values()

获取该枚举类对象数组

public static void valueOf(String args0)

根据字符串获取该枚举类中的对象

public final String name()

获取该枚举对象名字

public final Class getDeclaringClass()

获取枚举对象的枚举类型相对应的Class对象

public final int hashCode()

获取该枚举对象的hash值

public final int compareTo(E o)

两个枚举对象进行比较

public final boolean equals(Object other)

比较两个枚举对象是否相同

package com.wz.enum01;

public class test02 {
    /**
     * 知识点:枚举的方法
     *
     */
    public static void main(String[] args) {
        //根据字符串找到该枚举类中的对象
        Season season1 = Enum.valueOf(Season.class, "spring");
        System.out.println(season1);
        //根据字符串获取该枚举类中的对象
        Season season2 = Season.valueOf("spring");
        System.out.println(season2);
        System.out.println(season1==season2);
        //获取该枚举队对象的名字
        Season[] seasons = Season.values();
        for (Season season:seasons
             ) {
            System.out.println(season.name());
        }

    }
}

2023年6月3日,枚举,枚举底层实现_枚举类_02

2. 枚举底层

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
    //枚举对象名
    private final String name;
    //枚举编号 -- 从0开始
    private final int ordinal;
    
    //获取枚举对象名
    public final String name() {
        return name;
    }
    
    //获取枚举编号
    public final int ordinal() {
        return ordinal;
    }
    
    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }
    
}
package com.qf.enum02;

//枚举是一个特殊的类,默认继承Enum
public final class Season extends Enum{

    //该类的对象引用
	public static final Season spring;
	public static final Season summer;
	public static final Season autumn;
	public static final Season winter;
    
    //该类的属性
	private String name;//成员属性
	private String info;//成员属性
	private static final Season[] ENUM$VALUES;//枚举对象数组

    //public Season(){}
	private Season(String s, int i){
		super(s, i);
	}

    //public Season(String name,String info){}
	private Season(String s, int i, String name, String info)
	{
		super(s, i);
		this.name = name;
		this.info = info;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getInfo()
	{
		return info;
	}

	public void setInfo(String info)
	{
		this.info = info;
	}

	public String toString()
	{
		return (new StringBuilder(String.valueOf(name))).append(" -- ").append(info).toString();
	}

    //获取该枚举类所有的对象
	public static Season[] values()
	{
		Season aseason[];
		int i;
		Season aseason1[];
		System.arraycopy(aseason = ENUM$VALUES, 0, aseason1 = new Season[i = aseason.length], 0, i);
        
        //思路:创建新数组,将ENUM$VALUES中所有的元素复制到新数组中,返回新数组
        //设计思想:不把ENUM$VALUES暴露给外界,因为怕外界修改数组中的元素,所以创建新数组复制并返回
        //aseason = ENUM$VALUES;
        //int i = aseason.length;
        //Season aseason1[] = new Season[i];
        //System.arraycopy(aseason, 0, aseason1, 0, i);
        
		return aseason1;
	}

	public static Season valueOf(String s)
	{
		return (Season)Enum.valueOf(com/qf/enum02/Season, s);
	}

    //静态代码块 -- 目的:枚举类的初始化工作
	static {
        //创建枚举对象(枚举名,对象编号,自定义属性,自定义属性)
        //枚举名对象编号的数据传入父类中 -- super(s,i)
		spring = new Season("spring", 0, "春天", "春雨绵绵");
		summer = new Season("summer", 1, "夏天", "烈日炎炎");
		autumn = new Season("autumn", 2, "秋天", "硕果累累");
		winter = new Season("winter", 3, "冬天", "寒风凛凛");
        
        //初始化枚举对象数组
		ENUM$VALUES = (new Season[] {
			spring, summer, autumn, winter
		});
	}
}

3. 枚举的switch实现

创建数组,获取枚举对象的int值

package com.qf.enum02;

import java.io.PrintStream;

public class Test03{

    //[1,2,3,4]
	private static int $SWITCH_TABLE$com$qf$enum02$Season[];

	public static void main(String args[]){
        
        //switch底层处理枚举类型是获取到枚举类对象对应的int值
		switch ($SWITCH_TABLE$com$qf$enum02$Season()[Season.spring.ordinal()]){
            case 1:
                System.out.println("春天");
                break;

            case 2:
                System.out.println("夏天");
                break;

            case 3:
                System.out.println("秋天");
                break;

            case 4:
                System.out.println("冬天");
                break;

            default:
                System.out.println("默认");
                break;
		}
	}

    
    //初始化$SWITCH_TABLE$com$qf$enum02$Season数组 - 获取到枚举对象在switch的编号
    //注意1:枚举对象在枚举类中的编号是从0开始
    //注意2:枚举对象在switch中的编号从1开始 -- 思想:第几个枚举对象
	static int[] $SWITCH_TABLE$com$qf$enum02$Season(){
       
		//创建int数组 -- new int[4]
		int ai[] = new int[Season.values().length];
		try
		{
            //ai[获取枚举对象的编号]
            //ai[2] = 3;
			ai[Season.autumn.ordinal()] = 3;
		}
		catch (NoSuchFieldError ) { }
		try
		{
            //ai[0] = 1;
			ai[Season.spring.ordinal()] = 1;
		}
		catch (NoSuchFieldError ) { }
		try
		{
            //ai[1] = 2;
			ai[Season.summer.ordinal()] = 2;
		}
		catch (NoSuchFieldError ) { }
		try
		{
            //ai[3] = 4;
			ai[Season.winter.ordinal()] = 4;
		}
		catch (NoSuchFieldError ) { }
		return $SWITCH_TABLE$com$qf$enum02$Season = ai;
	}
}

标签:info,String,Season,name,枚举,2023,public,底层
From: https://blog.51cto.com/u_15098423/6411484

相关文章

  • 【闲话】2023.06.04
    简单记一下最近的事。期末进步了,虽然还是不满意吧。尤其是物理和语文。但是!我英语小作文满昏!没考过这样的,孩子乐傻了。高考放高考假好耶。但是六点半的早读是一败笔。祝学长学姐高考顺利!后面忘了但是塞尔达传说:王国之泪是……......
  • 域用户枚举和密码喷洒攻击横向移动
    域用户枚举和密码喷洒攻击横向移动目录域用户枚举和密码喷洒攻击横向移动一、域内用户枚举攻击原理二、域内用户枚举工具三、密码喷洒攻击原理四、密码喷洒工具一、域内用户枚举攻击原理正常域用户登录主机,我们可以通过"netuser/domain"来列举出域内的用户。但是当我们用非......
  • 2023校赛补题
    端水大师#include<bits/stdc++.h>usingnamespacestd;#definelllonglongintread(){intx=0,o=1;charch=getchar();while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')o=-1,ch=get......
  • 2023年第三届陕西省大学生网络安全技能大赛-pwn-may be all
    2023年第三届陕西省大学生网络安全技能大赛-pwn-maybeall?前言校队丢了两道题给我,看了看都是简单题,简单做了做。不知道具体叫什么名,就用pwn1、pwn2代替了。pwn1简单的格式化字符串泄露,除了远程docker的变量偏移不一样之外,没什么好说的。(出题人的docker可能有问题#!/usr/bin......
  • ansible实战-2023
    环境信息:cat/etc/ansible/hosts[webserver]192.168.31.18ansible_ssh_user=rootansible_ssh_pass=123456http_port=815testvar=31.18mysql_port=3309[dbserver]192.168.31.19ansible_ssh_user=rootansible_ssh_pass=123456http_port=816testvar=31.19mysql_port=3310......
  • 2023.5 codeforces 杂题选做
    2023.5codeforces杂题选做E.Location\(n\le5\times10^4\)的范围,并且区间赋值、区间维护最值,可以考虑分块。然后对于散块的修改可以直接暴力,对于整块,由于\(b_i\)值不变,\(a_i\)值只有一个,思考如何快速求。由于\(\dfrac{\operatorname{lcm}(a_i,b_i)}{\gcd(a_i,b_i)}=\d......
  • 2022-2023 java高级面试总结
    1.Java内存模型是什么?JMM即Java内存模型(Javamemorymodel),在JSR133里指出了JMM是用来定义一个一致的、跨平台的内存模型,是缓存一致性协议,用来定义数据读写的规则。Java内存模型规范java如何按需禁用缓存和编译优化的方法。2.mysql查询第一万条数据后20条数据,sql语句如何写?sel......
  • 2022-2023-java大厂面试真题
    【美团】面试真题: 1、SPRINGAOP底层原理 一、AOP概念: AOP(AspectOrientedProgramming),即面向切面编程,可以说是OOP(ObjectOrientedProgramming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发......
  • 论文感谢 2023年3月21日,作于余杭塘河右岸杭州师范大学 信息学院网络空间安全专业应届
    致谢春天已经过去,夏天将要到来,今夜下了很大的雨,青蛙聒噪的叫个不停。我合上论文草稿,打开窗户回忆过去。三年过去了,我却没有很大的成就;一千个日夜的追寻,却也渐渐领悟了科研的真谛。过去种种焦虑焦灼都让我眉头紧锁,所有的开心快乐也都浮上心头。回忆浮现眼前,就像昨天发生的一样,此时......
  • 2023年AMC8真题试卷分析,近年AMC8考点分布总结
     AMC8考点  AMC8的考点与7、8年级数学大纲相对应,包括(但不局限于)整数、分数、小数、百分数、比例、数论、日常的几何、面积、体积、概率及统计、逻辑推理等。 计算部分:大多有实际应用背景,类似应用题,涉及分数、百分数、小数计算,但是复杂程度较低。考察学生的计算能力,在算......