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…...
更全面的 Token 套餐来了:Agent Plan
作为一名 Token 消耗大户,各模型厂商和云厂商的套餐我基本都有入手:智谱、MiniMax、小米 Mimo,以及最早推出 Coding Plan 的火山引擎,这些都是我目前在订的。以前 Coding Plan 基本能够覆盖日常工作,但是随着越来越多场…...
给硬件工程师的芯片FT测试入门:从ATE、Handler到Socket,一次搞懂所有‘治具’
芯片FT测试全流程实战指南:从设备选型到治具配置 第一次走进芯片测试车间时,我被眼前那些闪烁着信号灯的庞大设备和精密治具震撼到了。作为硬件工程师,我们可能更熟悉PCB设计和电路仿真,但当芯片进入量产阶段,如何确保…...
如何让老旧游戏手柄重获新生:XOutput输入转换器完整指南
如何让老旧游戏手柄重获新生:XOutput输入转换器完整指南 【免费下载链接】XOutput DirectInput to XInput wrapper 项目地址: https://gitcode.com/gh_mirrors/xo/XOutput 你是否拥有一些老旧但质量优秀的游戏手柄、摇杆或方向盘,却发现在现代游戏…...
深入解析RISC-V CLINT:多核中断与定时器编程实战
1. 项目概述:深入理解SiFive U54内核的CLINT如果你正在基于SiFive的Freedom U540 SoC或者类似的RISC-V多核平台进行嵌入式开发,特别是涉及到操作系统移植、多核启动或者中断管理,那么“CLINT”(Core-Local Interruptor,…...
GO-Surf:基于神经特征网格的快速高保真三维表面重建技术解析
1. 项目概述:从点云到高保真表面的跨越在三维视觉与机器人领域,从一组稀疏的RGB-D图像序列中,快速、高质量地重建出物体的完整表面模型,一直是一个核心且富有挑战性的任务。传统的基于体素或点云的方法,要么在精度上难…...
别再死记公式了!用Cadence Virtuoso手把手仿真折叠Cascode运放的增益与带宽
折叠Cascode运放仿真实战:从理论到波形的完整验证指南 在模拟IC设计的海洋里,折叠Cascode运算放大器就像一艘兼具速度与稳定性的快艇——它能提供高增益、宽带宽和良好的输出摆幅。但当你从教科书走向Cadence Virtuoso的仿真界面时,是否经常遇…...
Knot高级技巧:局域网设备抓包和跨设备数据同步
Knot高级技巧:局域网设备抓包和跨设备数据同步 【免费下载链接】Knot 一款iOS端基于MITM(中间人攻击技术)实现的HTTPS抓包工具,完整的App,核心代码使用SwiftNIO实现 项目地址: https://gitcode.com/gh_mirrors/kn/Knot Knot是一款iOS端…...
npc_gzip异常处理与调试手册:解决压缩器错误的10个实用技巧
npc_gzip异常处理与调试手册:解决压缩器错误的10个实用技巧 【免费下载链接】npc_gzip Code for Paper: “Low-Resource” Text Classification: A Parameter-Free Classification Method with Compressors 项目地址: https://gitcode.com/gh_mirrors/np/npc_gzip…...
CANN/asc-devkit Round接口文档
Round 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann…...
解决Keil MDK中STM32 I2C驱动编译错误
1. 问题现象与背景分析最近在使用Keil MDK开发STM32项目时,遇到一个典型的编译错误。具体表现为:当使用STM32CubeMX生成项目并导入Keil MDK后,编译过程中CMSIS I2C驱动报出以下错误:error: use of undeclared identifier MX_I2C1_…...
