Enum枚举类与静态变量和静态数组的区别

Enum枚举类与静态变量和静态数组的区别

  • 组成结构
    • Enum枚举类
    • 静态变量
    • 静态数组
  • 组成结构的区别
    • 相同之处
    • 不同之处
  • 用法使用
    • 相同之处
    • 不同之处

组成结构

先来看下Enum枚举类,静态变量,静态数组的初始化过程,以下面为例子:

public enum FruitEnum {

    APPLE, ORANGE, BANANA, PEAR, CANTALOUPE, CHERRY, KIWIFRUIT, WATERMELON;

    static String value = "i";
    
    static String[] strings = {"a", "b", "c", "d", "e", "f", "g", "h"};

}

Enum枚举类

	/**
	* 每一个枚举值都分在一个enum
	**/
	// access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; APPLE
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; ORANGE
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; BANANA
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; PEAR
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; CANTALOUPE
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; CHERRY
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; KIWIFRUIT
	
	 // access flags 0x4019
	 public final static enum Lcn/abs/FruitEnum; WATERMELON

	/**
	*	一个枚举值初始化一个枚举类对象
	*	ICONST_* 代表的是枚举序列号
	**/
	NEW cn/abs/FruitEnum
	DUP
	LDC "APPLE"
	ICONST_0
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "ORANGE"
	ICONST_1
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "BANANA"
	ICONST_2
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "PEAR"
	ICONST_3
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "CANTALOUPE"
	ICONST_4
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "CHERRY"
	ICONST_5
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "KIWIFRUIT"
	BIPUSH 6
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;
	NEW cn/abs/FruitEnum
	DUP
	LDC "WATERMELON"
	BIPUSH 7
	INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)V
	PUTSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;
	
	/**
	*	提取每一个枚举类对象,并封装成一个枚举静态数组 cn/abs/FruitEnum.$VALUES
	*	ICONST_* 代表数组序列号
	**/
	BIPUSH 8
	ANEWARRAY cn/abs/FruitEnum
	DUP
	ICONST_0
	GETSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	ICONST_1
	GETSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	ICONST_2
	GETSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	ICONST_3
	GETSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	ICONST_4
	GETSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	ICONST_5
	GETSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	BIPUSH 6
	GETSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;
	AASTORE
	DUP
	BIPUSH 7
	GETSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;
	AASTORE
	PUTSTATIC cn/abs/FruitEnum.$VALUES : [Lcn/abs/FruitEnum;

可以看出Enum枚举类会将每一个枚举值都包装成一个带有枚举序列号的枚举类对象,然后再将枚举类对象封装成一个枚举数组。

另外,如上图所示(例如:public final static enum Lcn/abs/FruitEnum; APPLE)enum 用了 final 来修饰,Enum枚举类是不能够修改值。

静态变量

    LDC "i"
    PUTSTATIC cn/abs/FruitEnum.value : Ljava/lang/String;

从上面可以发现静态变量等同于一个枚举值初始化一个枚举类对象的环节。

静态数组

ANEWARRAY java/lang/String
    DUP
    ICONST_0
    LDC "a"
    AASTORE
    DUP
    ICONST_1
    LDC "b"
    AASTORE
    DUP
    ICONST_2
    LDC "c"
    AASTORE
    DUP
    ICONST_3
    LDC "d"
    AASTORE
    DUP
    ICONST_4
    LDC "e"
    AASTORE
    DUP
    ICONST_5
    LDC "f"
    AASTORE
    DUP
    BIPUSH 6
    LDC "g"
    AASTORE
    DUP
    BIPUSH 7
    LDC "h"
    AASTORE
    PUTSTATIC cn/abs/FruitEnum.strings : [Ljava/lang/String;

由此可见静态数组等同于把每一个枚举类对象封装成一个枚举数组的环节。

组成结构的区别

相同之处

  1. Enum枚举类在中间把一个枚举值包装成一个枚举类对象,这跟静态变量是一样的操作和结构。
  2. Enum枚举类最后也是封装成了一个静态数组,这是跟静态数组一样的最终结构形态。

不同之处

  1. Enum枚举类会把每一个枚举值都包装成一个枚举类对象后再封装成一个静态数组,而不是像静态数组把每一个数值都直接封装到一个静态数组中。
  2. Enum枚举类比静态变量多了对静态数组的封装。

用法使用

相同之处

  1. Enum枚举类,静态变量和静态数组都是一经定义不可变更。
  2. Enum枚举类,静态变量和静态数组都是存放在Metaspace中。

不同之处

  1. Enum枚举类具有枚举序列号,可以通过枚举类对象方法ordinal()提取,能够利用此枚举序列号进行枚举类对象的序列比较和排序,而静态数组可以按照stream流方式进行操作。
  2. Enum枚举类都是通过<Enum Clazz>.<Enum Value>来获取枚举值,使用上安全,不会出现越界,而静态数组需要通过指定index来获取数值,在指定index的时候不能保证index不越界,index越界会抛出错误异常,例如:ArrayIndexOutOfBoundsException,IndexOutOfBoundsException。
  3. 静态数组可以通过index直接获取值,Enum枚举类则是通过直观的名字获取值。
  4. Enum枚举可以在switch()中运用,静态变量和静态数组不能代表类型又代表不同数值没有办法在switch()中使用。
  5. Enum枚举类的枚举值就是枚举对象的名字,元素类型单一,并且需要匹配对象名字的命名规范。而静态变量和静态数组可以应用于不同的元素类型,包括基本类型和对象类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946288.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC】使用Java实现Azure语音服务批量转录功能:完整指南

文章目录 引言技术背景环境准备详细实现1. 基础架构设计2. 实现文件上传功能3. 提交转录任务crul4. 获取转录结果 使用示例结果示例最佳实践与注意事项总结 引言 在当今数字化时代&#xff0c;将音频内容转换为文本的需求越来越普遍。无论是会议记录、视频字幕生成&#xff0c…

【UVM】搭建一个验证平台

UVM环境组件 组件功能 sequence_item&#xff1a;包装数据 UVM中&#xff0c;所有的transaction都要从uvm_sequence_item派生sequence item是每一次driver与DUT互动的最小粒度内容sequence&#xff1a;产生数据 uvm_sequence是一个参数化的类&#xff0c;其参数是transactio…

用Python操作字节流中的Excel文档

Python能够轻松地从字节流中加载文件&#xff0c;在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作&#xff0c;并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性&#xff0c;还确保了数据的安全性和完整性&#xff0c;尤其是在网络…

.Net加密与Java互通

.Net加密与Java互通 文章目录 .Net加密与Java互通前言RSA生成私钥和公钥.net加密出数据传给Java端采用java方给出的公钥进行加密采用java方给出的私钥进行解密 .net 解密来自Java端的数据 AES带有向量的AES加密带有向量的AES解密无向量AES加密无向量AES解密 SM2(国密)SM2加密Sm…

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求&#xff0c;现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为&#xff1a;co.elastic.clients:elasticsearch-…

119.【C语言】数据结构之快速排序(调用库函数)

目录 1.C语言快速排序的库函数 1.使用qsort函数前先包含头文件 2.qsort的四个参数 3.qsort函数使用 对int类型的数据排序 运行结果 对char类型的数据排序 运行结果 对浮点型数据排序 运行结果 2.题外话:函数名的本质 1.C语言快速排序的库函数 cplusplus网的介绍 ht…

JVM实战—G1垃圾回收器的原理和调优

1.G1垃圾回收器的工作原理 (1)ParNew CMS的组合有哪些痛点 Stop the World是最大的问题。无论是新生代GC还是老年代GC&#xff0c;都会或多或少产生STW现象&#xff0c;这对系统的运行是有一定影响的。 所以JVM对垃圾回收器的优化&#xff0c;都是朝减少STW的目标去做的。在这…

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力

HuatuoGPT-o1&#xff1a;基于40K可验证医学问题的两阶段复杂推理增强框架&#xff0c;通过验证器引导和强化学习提升医学模型的推理能力 论文大纲理解1. 确认目标2. 分析过程3. 实现步骤4. 效果展示 解法拆解全流程提问俩阶段详细分析 论文&#xff1a;HuatuoGPT-o1, Towards …

HTML——45.单元格合并

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--合并单元格&#xff1a;1.在代码中找到要合并的单元格2.在要合并的所有单元格中&#xff0c;保留要合并的第一个单元格…

electron在arm64架构交叉编译遇到libnotify/notify.h文件找不到错误记录

问题描述 在按照官方文档进行arm64下electron编译时出现下面的错误&#xff0c;编译环境为ubuntun22.04.5。 问题分析 由于当前目标架构是arm64&#xff0c;所以从上图可知sysroot为build/linux/debian_bullseye_arm64-sysroot&#xff0c;进入到该目录下查看libnotify的头文…

我的创作纪念日与2024年年报

我的创作纪念日 机缘 原来是你&#xff01; 收获 在创作的过程中都有哪些收获 获得了14668粉丝的关注。获得了正向或者反向的反馈&#xff1a;1万多赞、426评论、140多万阅读量等。认识和哪些志同道合的领域同行&#xff1a;有且再寻觅。 日常 &#x1f3e0;个人主页&…

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定(升级版)

文章目录 1、updateInviteCodeStatus2、handleLock3、InviteCodeController4、InviteCodeService5、CrudRepository 点击锁定按钮&#xff0c;锁定按钮要变成解锁按钮&#xff0c;然后状态要从待绑定变成 已锁定&#xff1a;https://blog.csdn.net/m0_65152767/article/details…

使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包

作者&#xff1a;刘大 前言 在使用iClient for MapboxGL/MapLibreGL项目开发中&#xff0c;往往会对接非EPSG:3857坐标系的地图&#xff0c;由于默认不支持&#xff0c;因此需引入mapboxgl-enhance/maplibre-gl-enhance扩展包。 在使用Vue等其他框架&#xff0c;通过npm包下载…

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;

UnityRenderStreaming使用记录(三)

测试UnityRenderStreaming在Ubuntu24.04.1LTS上的表现 先放上运行图操作系统 Ubuntu24.04.1LTSUnity测试工程环境相关修改遇到的问题 先放上运行图 操作系统 Ubuntu24.04.1LTS 系统下载地址 https://cn.ubuntu.com/download/desktop安装UnityHub https://blog.csdn.net/AWNUXC…

电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教

0 缘起 一台联想电脑&#xff0c;使用Windows 10 专业版32位&#xff0c;电脑主机后置音频插孔一直没有声音&#xff0c;所以音箱是接在机箱前面版的前置音频插孔上的。 一天不小心捱到了音箱的音频线&#xff0c;音频线头断在音频插孔里面了&#xff0c;前置音频插孔因此用不…

【项目】智能BI洞察引擎 测试报告

目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试&#xff08;异步&#xff09;测试用例测试结…

年会头投票小游戏

原型预览 源码 https://github.com/open-frame/vote 原型源文件 https://download.csdn.net/download/qq_42618566/90206788

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;基础知识”活动&#xff0c;培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动&#xff0c;扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

springboot499基于javaweb的城乡居民基本医疗信息管理系统(论文+源码)_kaic

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…