Java 自定义集合常量

文章目录

  • 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();
    }

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

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

相关文章

用win的控制台去远程连接虚拟机linux的终端

以Ubuntu为例&#xff0c;首先确保Ubuntu已经安装了ssh服务 sudo apt-get install openssh-server输入密码 安装完毕后查看ssh状态是否开启 sudo systemctl status ssh 显示绿色激活状态&#xff0c;可以关闭或开启 对应start和stop winr打开win端控制台 输入 ssh -p 22 …

python-22-零基础自学python-数据分析基础 打开文件 读取文件信息

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 读取文件 、逐行读取文件信息等 练习内容&#xff1a; 练习10-1:Python学习笔记 在文本编辑器中新建一个文件&#xff0c;写几句话来总结一下你至此学到的Python知识&#xff0c;其中…

ASCII码对照表(Matplotlib颜色对照表)

文章目录 1、简介1.1 颜色代码 2、Matplotlib库简介2.1 简介2.2 安装2.3 后端2.4 入门例子 3、Matplotlib库颜色3.1 概述3.2 颜色图的分类3.3 颜色格式表示3.4 内置颜色映射3.5 xkcd 颜色映射3.6 颜色命名表 4、Colorcet库5、颜色对照表结语 1、简介 1.1 颜色代码 颜色代码是…

声明队列和交换机 + 消息转换器

目录 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 方法二&#xff1a;基于Spring注解的方式声明 2、消息转换器 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 注&#xff1a;队列和交换机的声明是放在消费者这边的&#xff0c;这位发送的人他…

OSS存储桶漏洞总结

简介 OSS&#xff0c;对象存储服务&#xff0c;对象存储可以简单理解为用来存储图片、音频、视频等非结构化数据的数据池。相对于主机服务器&#xff0c;具有读写速度快&#xff0c;利于分享的特点。 OSS工作原理&#xff1a; 数据以对象&#xff08;Object&#xff09;的形式…

Java高级重点知识点-21-IO、字节流、字符流、IO异常处理、Properties中的load()方法

文章目录 IOIO的分类 字节流字节输出流【OutputStream】字节输入流【InputStream】图片复制 字符流字符输入流【FileReader】字符输出流【FileWriter】 IO异常的处理&#xff08;扩展知识&#xff09;Properties属性集(java.util) IO Java中I/O操作主要是指使用 java.io 包下的…

iOS中多个tableView 嵌套滚动特性探索

嵌套滚动的机制 目前的结构是这样的&#xff0c;整个页面是一个大的tableView, Cell 是整个页面的大小&#xff0c;cell 中嵌套了一个tableView 通过测试我们发现滚动的时候&#xff0c;系统的机制是这样的&#xff0c; 我们滑动内部小的tableView, 开始滑动的时候&#xff0c…

想知道你的电脑能不能和如何升级RAM吗?这里有你想要的一些提示

考虑给你的电脑增加更多的RAM,但不确定从哪里开始?本指南涵盖了有关升级Windows PC或笔记本电脑中RAM的所有信息。 你需要升级RAM吗 在深入研究升级RAM的过程之前,评估是否需要升级是至关重要的。你是否经历过系统滞后、频繁的BSOD错误或应用程序和程序突然崩溃?这些症状…

Lock与ReentrantLock

在 Java 中&#xff0c;Lock 接口和 ReentrantLock 类提供了比使用 synchronized 方法和代码块更广泛的锁定机制。 简单示例&#xff1a; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {pr…

聊一下Maven打包的问题(jar要发布)

文章目录 一、问题和现象二、解决方法&#xff08;1&#xff09;方法一、maven-jar-pluginmaven-dependency-plugin&#xff08;2&#xff09;方法二、maven-assembly-plugin 一、问题和现象 现在的开发一直都是用spring boot&#xff0c;突然有一天&#xff0c;要自己开发一个…

【CUDA】

笔者在学习Softmax实现时遇到了一个问题&#xff0c;很多文章直接将softmax的计算分成了五个过程&#xff0c;而没有解释每个过程的含义&#xff0c;尤其是在阅读这篇文章时&#xff0c;作者想计算最基本的softmax的效率&#xff0c;以展示可行的优化空间&#xff1a; 贴一个g…

MybatisX插件的简单使用教程

搜索mybatis 开始生成 module path&#xff1a;当前项目 base package:生成的包名&#xff0c;建议先独立生成一个&#xff0c;和你原本的项目分开 encoding&#xff1a;编码&#xff0c;建议UTF-8 class name strategy&#xff1a;命名选择 推荐选择camel&#xff1a;驼峰命…

Centos下rpm和yum执行卡住问题(已解决)

问题描述 执行rpm和yum卡住&#xff0c; 没有任何报错信息&#xff0c;且无法 ctrl c 终止&#xff0c;只能通过后台 kill -9 杀死。 问题排查&#xff1a; 查看yum日志&#xff1a;yum -vv 软件包 会发现卡在 loading keyring from rpmdb&#xff0c;即load DB存在问题。 …

MSPM0G3507——MPU6050读取数据显示在OLED上

移植的立创L1306的部分代码&#xff0c;亲测能用&#xff0c;要源码的评论即可&#xff0c;在CCSTHEIA打开

【代码管理的必备工具:Git的基本概念与操作详解】

一、Git 初识 1.提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种⽂档时&#xff0c;为了防止⽂档丢失&#xff0c;更改失误&#xff0c;失误后能恢复到原来的版本&#xff0c;不得不复制出⼀个副本&#xff0c;比如&#xff1a; “…

推荐几款漂亮的代码字体

Visual Studio Code 中字体看时间长了就会产生幻觉&#xff0c;于是今天看到有人推荐漂亮的代码字体&#xff0c;于是自己也推荐几款&#xff1a; 需要注意的是&#xff0c;大部分网上的教程都建议使用混合字体&#xff0c;即使用微软雅黑与某种等宽字体混合。但事实上&#x…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码&#xff1a;https://github.com/chongzhou96/MaskCLIP 论文&#xff1a;https://arxiv.org/abs/2112.01071 摘要 对比语言-…

接口测试分析、设计以及实现

接口相关理论 ui功能测试和接口测试哪个先执行&#xff1f;–为什么 结论&#xff1a;接口测试先执行 原因&#xff1a;ui功能测试需要等待前端页面开发完成、后台接口开发完后且前端与后端联调完成。ui功能测试与接口测试的区别&#xff1f; ui功能&#xff1a;功能调用&am…

windows上传app store的构建版本简单方法

我们在上传app store上架&#xff0c;或上传到testflight进行ios的app测试的时候&#xff0c;需要mac下的上传工具上传ipa文件到app store的构建版本上。 然而windows电脑这些工具是无法安装的。 因此&#xff0c;假如在windows上开发hbuilderx或uniapp的应用&#xff0c;可以…

程序升级bootloader

文章目录 概述什么是bootloader&#xff1f;为什么用&#xff1f;bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机&#xff0c;上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…