Java 自定义集合常量

news2024/11/29 4:51:05

文章目录

  • Java 自定义集合常量
    • 一、普通方法自定义集合常量信息
      • 1、定义 Map 集合信息
        • (1)方法一:使用静态代码块
        • (2)方法二:简单定义 Map 常量
      • 2、定义 List 集合信息
      • 3、定义 Set 集合信息
    • 二、通过 Collections 定义集合常量
    • 三、拓展:定义数组常量的最佳方式

Java 自定义集合常量

一、普通方法自定义集合常量信息

1、定义 Map 集合信息

(1)方法一:使用静态代码块
public static final Map CONSTANT_MAP_1 = new HashMap();

static {
        CONSTANT_MAP_1.put("01", "同意");
        CONSTANT_MAP_1.put("02", "不同意");
        CONSTANT_MAP_1.put("03", "待定");
    }

测试:

Set<String> keys1 = Constants.CONSTANT_MAP_1.keySet();
for (String key : keys1) {
    System.out.println("常量 Map 的 key:" + key + " ,值是:" + Constants.CONSTANT_MAP_1.get(key));
 }        

打印结果:
在这里插入图片描述

(2)方法二:简单定义 Map 常量
public static final Map<String, String> CONSTANT_MAP_2 = new HashMap<String, String>() {
        {
            put("A", "父母");
            put("B", "姑侄");
            put("C", "爷孙");
        }
    };

测试:

Set<String> keys2 = Constants.CONSTANT_MAP_2.keySet();
        for (String key : keys2) {
            System.out.println("常量 Map 的 key:" + key + " ,值是:" + Constants.CONSTANT_MAP_2.get(key));
        }

打印结果:
在这里插入图片描述

2、定义 List 集合信息

public static final List<String> CONSTANT_LIST_1 = Arrays.asList("01", "02", "03");

测试:

String relationType = "01";
if (Constants.CONSTANT_LIST_1.contains(relationType)){
            System.out.println("集合包含 relationType:"+relationType);
	}       

打印结果:
在这里插入图片描述

3、定义 Set 集合信息

public static final Set<Integer> CONSTANT_SET_1 = new HashSet<>(Arrays.asList(1,2,3));

测试:

		Integer num = 1;
        if (Constants.CONSTANT_SET_1.contains(num)){
            System.out.println("集合包含数字:"+num);
        }

打印结果:
在这里插入图片描述
需要注意的是:

普通的集合对象(如ArrayList、HashMap、HashSet等)都是可变集合对象,即便是定义为静态常量,也可以通过操作方法进行修改。所以,上面方法定义的集合常量,并不是真正意义上的集合常量。

比如,Arrays.asList 方法生成的 ArrayList 不能执行 add/remove/clear方法,但是可以执行 set 方法,也属于可变集合对象。
在上面的定义 List 集合信息时,定义了集合常量 CONSTANT_LIST_1

public static final List<String> CONSTANT_LIST_1 = Arrays.asList("01", "02", "03");

但是在使用时,可以通过 set 方法去改变集合的值,如下:

 		Constants.CONSTANT_LIST_1.set(0,"09"); // 通过 set 方法修改集合下标是 0 的值
        if (Constants.CONSTANT_LIST_1.contains("01")){
            System.out.println("集合值没被改变");
        }else {
            System.out.println("集合值被改变");
        }

打印结果:
在这里插入图片描述
由打印结果可知,集合的值已经被改变了。为了避免这种情况发生,在JDK中,Collections 工具类中提供一套方法,用于把可变集合对象变为不可变 (不可修改,修改时会抛出 UnsupportedOperationException 异常)集合对象。所以,可以利用这套方法定义集合静态常量。

二、通过 Collections 定义集合常量

	// 定义 List 集合常量
 	public static final List<String> CONSTANT_LIST_2 = Collections.unmodifiableList(Arrays.asList("01", "02", "03"));

	// 定义 Set 集合常量
    public static final Set<Integer> CONSTANT_SET_2 = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1, 2, 3)));
	
	// 定义 Map 集合常量
    public static final Map<String, String> CONSTANT_MAP_3;

    static {
        CONSTANT_MAP_3 = Collections.unmodifiableMap(new HashMap<String, String>() {{
            put("01", "同意");
            put("02", "不同意");
        }});
    }

以 List 为例测试:

		Constants.CONSTANT_LIST_2.set(0,"09");
        if (Constants.CONSTANT_LIST_2.contains("01")){
            System.out.println("集合值没被改变");
        }else {
            System.out.println("集合值被改变");
        }

打印结果:
在这里插入图片描述

三、拓展:定义数组常量的最佳方式

一般情况下,定义数组常量如下:

public static final int[] CONSTANT_ARRAY = new int[]{1,2,3};

但是,可以通过下标修改数组值,导致数组常量的值可变。所以,这种方法定义的数组常量,并不是一个真正意义上的数组常量。最佳法 “私有数组常量+公有克隆方法” 的解决方案。

如下代码所示:先定义一个私有数组常量,保证不会被外部类使用;在定义一个获取数组常量方法,并返回一个数组常量的克隆值。

	private static final int[] CONSTANT_ARRAY_2 = new int[]{1, 2, 3};
	
	//由于每次返回的是一个克隆数组,即便修改了克隆数组的常量值,也不会导致原始数组常量值的修改。
    public static int[] getConstantArray() {
        return CONSTANT_ARRAY_2.clone();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js-path 模块

path 模块 path 模块提供了 操作路径 的功能&#xff0c;如下是几个较为常用的几个 API&#xff1a; 代码实例&#xff1a; const path require(path);//获取路径分隔符 console.log(path.sep);//拼接绝对路径 console.log(path.resolve(__dirname, test));//解析路径 let pa…

一文学会 BootStrap

文章目录 认识BootStrap历史优缺点使用注意安装CDN源码引入包管理器 媒体查询屏幕尺寸的分割点&#xff08;Breakpoints&#xff09;响应式容器网格系统基本使用底层实现.container.row.col、.col-份数 网格嵌套自动布局列 Auto-layout响应式类 Responsive Class 响应式工具类-…

前端根据目录生成模块化路由routes

根据约定大于配置的逻辑&#xff0c;如果目录结构约定俗成&#xff0c;前端是可以根据目录结构动态生成路由所需要的 route 结构的&#xff0c;这个过程是要在编译时 进行&#xff0c;生成需要的代码&#xff0c;保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…

Qt(二)弹窗类 颜色对话框 字体对话框 资源文件

文章目录 一、QDebug类和QMessagebox类&#xff08;一&#xff09;QDebug类&#xff1a;打印调试类&#xff08;二&#xff09;QMessagebox类&#xff1a;弹窗类2. 修改组件图标&#xff08;1&#xff09;通过ui界面&#xff08;2&#xff09;通过QIcon的方式&#xff08;3&…

SpringBoot新手快速入门系列教程五:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1&#xff0c;先新建一个项目&#xff0c;我们叫它“HelloJPA”并且添加依赖 2&#xff0c;引入以下依赖&#xff1a; Spring Boot DevTools (可选&#xff0c;但推荐&#xff0c;用于开发时热部署)Lombok&#xff08;可选&#xff0c…

如何在前端网页实现live2d的动态效果

React如何在前端网页实现live2d的动态效果 业务需求&#xff1a; 因为公司需要做机器人相关的业务&#xff0c;主要是聊天形式的内容&#xff0c;所以需要一个虚拟的卡通形象。而且为了更直观的展示用户和机器人对话的状态&#xff0c;该live2d动画的嘴型需要根据播放的内容来…

aardio —— 今日减bug

打字就减bug 鼠标双击也减bug 看看有多少bug够你减的 使用方法&#xff1a; 1、将资源附件解压缩&#xff0c;里面的文件夹&#xff0c;放到aardio\plugin\plugins 目录 2、aardio 启动插件 → 插件设置 → 选中“今日减bug” → 保存。 3、重启 aardio&#xff0c;等aa…

高效率写文案软件有哪些?5款免费文案生成器值得拥有

在信息洪流奔涌的当下&#xff0c;文案的重要性愈发凸显。对于文案创作者来说&#xff0c;找到能提高效率的软件至关重要&#xff0c;如&#xff1a;市面上有些不错的文案生成器&#xff0c;它们能够为大家自动生成出高质量文案内容&#xff0c;给文案创作者提供了非常大的帮助…

Python和MATLAB微机电健康推导算法和系统模拟优化设计

&#x1f3af;要点 &#x1f3af;惯性测量身体活动特征推导健康状态算法 | &#x1f3af;卷积网络算法学习惯性测量数据估计六自由度姿态 | &#x1f3af;全球导航卫星系统模拟&#xff0c;及惯性测量动态测斜仪算法、动态倾斜算法、融合算法 | &#x1f3af;微机电系统加速度…

vb.netcad二开自学笔记2:认识vs编辑器

认识一下宇宙第一编辑器的界面图标含义还是很重要的&#xff0c;否则都不知道面对的是什么还怎么继续&#xff1f; 一、VS编辑器中常见的图标的含义 变量 长方体&#xff1a;变量 局部变量 两个矩形块&#xff1a;枚举 预定义的枚举 紫色立方体&#xff1a;方法 橙色树状结构…

vs2022安装qt vs tool

1 缘由 由于工作的需要&#xff0c;要在vs2022上安装qt插件进行开发。依次安装qt&#xff0c;vs2022&#xff0c;在vs2022的扩展管理中安装qt vs tool。 2 遇到困难 问题来了&#xff0c;在qt vs tool的设置qt version中出现问题&#xff0c;设置msvc_64-bit时出现提示“invali…

理解GCN

一、从CNN到GNN 1、CNN可被视为一类特殊的GNN&#xff0c;相邻节点大小顺序固定的GNN。 2、利用消息传递进行节点分类的例子&#xff1a; 给定上面的图&#xff0c;和少量已经分类的节点&#xff08;红&绿&#xff09;&#xff0c;对剩余其他节点进行分类&#xff0c;这是…

C语言 do while 循环语句练习 中

练习&#xff1a; 4.编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 // 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 //welcome to china!!! //w ! //we !! //wel !!! //.... //welco…

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…

均匀采样信号的鲁棒Savistky-Golay滤波(MATLAB)

S-G滤波器又称S-G卷积平滑器&#xff0c;它是一种特殊的低通滤波器&#xff0c;用来平滑噪声数据。该滤波器被广泛地运用于信号去噪&#xff0c;采用在时域内基于多项式最小二乘法及窗口移动实现最佳拟合的方法。与通常的滤波器要经过时域&#xff0d;频域&#xff0d;时域变换…

Linux操作系统的引导过程

系统初始化进程与文件、systemd概述、单元类型、切换运行级别、查看系统默认默认运行、永久切换、常见的系统服务&#xff08;centos&#xff09;-CSDN博客 centos 7系统升级内核&#xff08;ELRepo仓库&#xff09;、小版本升级、自编译内核-CSDN博客 ss命令详细使用讲解文…

Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息

摘要&#xff1a; 本文将介绍如何构建一个基于Zigbee和微信小程序的智能家居网关&#xff0c;实现对家居传感器数据的采集、汇总和展示。用户可通过微信小程序实时查看家中温湿度、光照等环境数据&#xff0c;为智能家居系统提供数据支撑。 关键词&#xff1a; Zigbee&#xf…

Docker简单入门

docker简单入门 &#x1f91a;我的博客&#x1f95b;前言 docker安装&#x1f537;常见命令镜像命令容器命令其他命令 docker部署mysql容器docker数据卷&#x1f537;挂载数据卷&#x1f537;本地目录挂载 创建一个自定义Docker镜像&#x1f537;镜像文件&#x1f537;构建镜像…

逻辑图框架图等结构图类图的高效制作方式不妨进来看看

**逻辑图框架图等结构图类图的高效制作方式不妨进来看看** 基于我们每天都在处理大量的数据和信息。为了更清晰地理解和传达这些信息&#xff0c;结构图、逻辑图和框架图等可视化工具变得越来越重要。然而&#xff0c;如何高效地制作这些图表并确保其准确性和易读性呢&#xf…

UCOS-III 任务同步机制-信号量

1. 信号量类型 1.1 二值信号量&#xff08;Binary Semaphores&#xff09; 二值信号量只有两个状态&#xff1a;可用&#xff08;1&#xff09;和不可用&#xff08;0&#xff09;。它主要用于任务之间的互斥访问或者事件通知。例如&#xff0c;当一个任务完成某个操作后&am…