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 0x4019public final static enum Lcn/abs/FruitEnum; APPLE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; ORANGE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; BANANA// access flags 0x4019public final static enum Lcn/abs/FruitEnum; PEAR// access flags 0x4019public final static enum Lcn/abs/FruitEnum; CANTALOUPE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; CHERRY// access flags 0x4019public final static enum Lcn/abs/FruitEnum; KIWIFRUIT// access flags 0x4019public final static enum Lcn/abs/FruitEnum; WATERMELON/*** 一个枚举值初始化一个枚举类对象* ICONST_* 代表的是枚举序列号**/NEW cn/abs/FruitEnumDUPLDC "APPLE"ICONST_0INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "ORANGE"ICONST_1INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "BANANA"ICONST_2INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "PEAR"ICONST_3INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "CANTALOUPE"ICONST_4INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "CHERRY"ICONST_5INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "KIWIFRUIT"BIPUSH 6INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "WATERMELON"BIPUSH 7INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;/*** 提取每一个枚举类对象,并封装成一个枚举静态数组 cn/abs/FruitEnum.$VALUES* ICONST_* 代表数组序列号**/BIPUSH 8ANEWARRAY cn/abs/FruitEnumDUPICONST_0GETSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;AASTOREDUPICONST_1GETSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;AASTOREDUPICONST_2GETSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;AASTOREDUPICONST_3GETSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;AASTOREDUPICONST_4GETSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;AASTOREDUPICONST_5GETSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;AASTOREDUPBIPUSH 6GETSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;AASTOREDUPBIPUSH 7GETSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;AASTOREPUTSTATIC 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/StringDUPICONST_0LDC "a"AASTOREDUPICONST_1LDC "b"AASTOREDUPICONST_2LDC "c"AASTOREDUPICONST_3LDC "d"AASTOREDUPICONST_4LDC "e"AASTOREDUPICONST_5LDC "f"AASTOREDUPBIPUSH 6LDC "g"AASTOREDUPBIPUSH 7LDC "h"AASTOREPUTSTATIC cn/abs/FruitEnum.strings : [Ljava/lang/String;
由此可见静态数组等同于把每一个枚举类对象封装成一个枚举数组的环节。
组成结构的区别
相同之处
- Enum枚举类在中间把一个枚举值包装成一个枚举类对象,这跟静态变量是一样的操作和结构。
- Enum枚举类最后也是封装成了一个静态数组,这是跟静态数组一样的最终结构形态。
不同之处
- Enum枚举类会把每一个枚举值都包装成一个枚举类对象后再封装成一个静态数组,而不是像静态数组把每一个数值都直接封装到一个静态数组中。
- Enum枚举类比静态变量多了对静态数组的封装。
用法使用
相同之处
- Enum枚举类,静态变量和静态数组都是一经定义不可变更。
- Enum枚举类,静态变量和静态数组都是存放在Metaspace中。
不同之处
- Enum枚举类具有枚举序列号,可以通过枚举类对象方法ordinal()提取,能够利用此枚举序列号进行枚举类对象的序列比较和排序,而静态数组可以按照stream流方式进行操作。
- Enum枚举类都是通过<Enum Clazz>.<Enum Value>来获取枚举值,使用上安全,不会出现越界,而静态数组需要通过指定index来获取数值,在指定index的时候不能保证index不越界,index越界会抛出错误异常,例如:ArrayIndexOutOfBoundsException,IndexOutOfBoundsException。
- 静态数组可以通过index直接获取值,Enum枚举类则是通过直观的名字获取值。
- Enum枚举可以在switch()中运用,静态变量和静态数组不能代表类型又代表不同数值没有办法在switch()中使用。
- Enum枚举类的枚举值就是枚举对象的名字,元素类型单一,并且需要匹配对象名字的命名规范。而静态变量和静态数组可以应用于不同的元素类型,包括基本类型和对象类型。
相关文章:
Enum枚举类与静态变量和静态数组的区别
Enum枚举类与静态变量和静态数组的区别 组成结构Enum枚举类静态变量静态数组 组成结构的区别相同之处不同之处 用法使用相同之处不同之处 组成结构 先来看下Enum枚举类,静态变量,静态数组的初始化过程,以下面为例子: public enu…...

uniapp——微信小程序读取bin文件,解析文件的数据内容(三)
微信小程序读取bin文件内容 读取用户选择bin文件,并解析数据内容,分包发送给蓝牙设备; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档: getFileSystemManager 关于App端读取bin文件,请查看&…...
SpringBoot集成ECDH密钥交换
简介 对称加解密算法都需要一把秘钥,但是很多情况下,互联网环境不适合传输这把对称密码,有密钥泄露的风险,为了解决这个问题ECDH密钥交换应运而生 EC:Elliptic Curve——椭圆曲线,生成密钥的方法 DH&…...
python文件操作相关(excel)
python文件操作相关(excel) 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程
一、摘要 在当今的数字化时代,软件开发就像是一场探险,每个开发者都是探险家,探索着代码的奥秘。React作为前端开发的领军框架,其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现,则为…...

【面试系列】深入浅出 Spring Boot
熟悉SpringBoot,对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解; 面试题 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?Spring Boot的自动配置原理是什么?你如何理解 Spring Boot 配置…...
@colyseus/social 模块详解
@colyseus/social 模块介绍 @colyseus/social 是一个适用于 Colyseus 游戏框架的扩展模块,提供了社交功能的支持,帮助开发者在多人游戏中快速实现玩家之间的社交互动。它主要提供了玩家账户管理、好友系统、好友请求、组队和聊天功能等,旨在简化游戏中社交功能的实现。 核心…...

石岩路边理发好去处
周末带娃去罗租公园玩,罗租公园旁边就是百佳华和如意豪庭小区,发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避,例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

ROS 2中的DDS中间件
文章目录 一、简介二、默认支持的 DDS (Data Distribution Service) 实现三、切换DDS实现小结 一、简介 中间件是一个软件层,通常用于连接不同的应用程序、服务或系统,以便它们能够相互通信和交换数据。中间件并不直接向用户暴露,而是在系统…...

「下载」智慧文旅运营综合平台解决方案:整体架构,核心功能设计
智慧文旅运营综合平台,旨在通过集成大数据、云计算、物联网、人工智能等先进技术,为景区、旅游企业及相关管理机构提供一站式的智慧化运营服务。 智慧文旅运营综合平台不仅能够提升游客的游览体验,还能帮助景区管理者实现资源的优化配置和业务…...

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?
在视频监控系统中,FFmpeg常用于从各种源(如摄像头、文件、网络流等)获取流媒体数据,这个过程通常称为“取流”。 在EasyNVR平台中,使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具ÿ…...

计算机因进程结束导致白屏
问题场景: 计算机卡顿利用(右击计算机桌面底部任务栏->打开任务管理器->结束任务->或进程被意外结束导致白屏) 问题描述 白屏 原因分析: 在结束进程时,导致 文件资源管理器 进程崩溃。 解决方案…...
OpenGL入门最后一章观察矩阵(照相机)
前面的一篇文章笔者向大家介绍了模型变化矩阵,投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中,我们看到了即使没有观察矩阵,我们也能对绘制出来的模型有一…...
ES6中定义私有属性详解
在ES6中,定义私有属性的方式相对传统的JavaScript有所不同。ES6并没有提供直接的语法来定义私有属性,但可以通过几种方法间接实现私有属性。 1. 使用Symbol来模拟私有属性 Symbol是一种新的数据类型,可以作为对象的键,并且它的值…...

工业5G路由器让无人机数据传输 “飞” 起来
无人机上搭载5G通信模块,该模块与工业5G路由器通过5G网络建立连接。无人机的飞控系统、传感器以及摄像头等设备采集到的数据,如飞行姿态、高度、速度、环境图像、温度湿度等,经过编码、加密、调制等处理后转换为适合5G网络传输的信号形式。 …...
面试经典150题——滑动窗口
文章目录 1、长度最小的子数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、无重复字符的最长子串2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、串联所有单词的子串3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、最小覆盖子串4.1 题目链接4.2 题目描…...

MiFlash 线刷工具下载合集
MiFlash 线刷工具下载合集 MiFlash 线刷工具下载合集 – MIUI历史版本相较于小米助手的刷机功能,线刷还是偏好使用 MiFlash。特点是界面简单纯粹,有自定义高级选项,可以选择刷机不上 BL 锁,自定义刷机脚本,EDL 刷机模…...

【MySQL高级】第1-4章
第1章 存储过程 1.1 什么是存储过程? 存储过程可称为过程化SQL语言,是在普通SQL语句的基础上增加了编程语言的特点,把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中,通过逻辑判断、循环等操作实现复杂计算的程序语言。 换…...

课程设计项目之基于Python实现围棋游戏代码
项目介绍 游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考 效果预览 源码下载 h…...
uni-app tab 双击事件监听
1、data中定义属性,用于临时记录点击次数 tabClick: {touchNum: 0 },2、添加页面事件监听方法 onTabItemTap(e) {this.tabClick.touchNumsetTimeout(()>{if(this.tabClick.touchNum > 2){// 双击执行代码区}this.tabClick.touchNum 0}, 250) },个人博客&am…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...