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…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
