解析Java中1000个常用类:EnumSet类,你学会了吗?

在线工具站
  • 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。
程序员资料站
  • 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程、各大面试专题,还有常用开发工具的教程。
小报童专栏精选Top100
  • 推荐一个小报童专栏导航站:小报童精选Top100(http://xbt100.top),收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~

在 Java 编程中,集合(Set)是一个常用的数据结构,用于存储不重复的元素。在某些特定场景下,使用枚举类型作为集合的元素可以提高代码的可读性和性能。Java 提供了一个专门为枚举类型设计的集合类——EnumSet

1. EnumSet 类概述

1.1 定义

EnumSetjava.util 包中的一个抽象类,用于创建具有枚举类型元素的高效集合。定义如下:

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>implements Cloneable, Serializable {// 常用方法省略...
}

1.2 主要特点

  • 高效EnumSet 在内部使用位向量(bit vector)实现,性能非常高。
  • 枚举类型安全:元素必须是枚举类型,避免了类型转换错误。
  • 有序性:按枚举类型的自然顺序存储元素。
  • 低内存开销:相比于其他集合类,EnumSet 更加节省内存。

2. 常用方法

2.1 of 方法

of 方法用于创建包含指定枚举值的 EnumSet。该方法有多种重载形式:

public static <E extends Enum<E>> EnumSet<E> of(E e)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)

示例:

EnumSet<Day> days = EnumSet.of(Day.MONDAY, Day.WEDNESDAY);

2.2 allOf 方法

allOf 方法用于创建包含指定枚举类型所有枚举值的 EnumSet

public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)

示例:

EnumSet<Day> allDays = EnumSet.allOf(Day.class);

2.3 noneOf 方法

noneOf 方法用于创建一个空的 EnumSet

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)

示例:

EnumSet<Day> noDays = EnumSet.noneOf(Day.class);

2.4 range 方法

range 方法用于创建一个包含从 fromto(包括两者)所有枚举值的 EnumSet

public static <E extends Enum<E>> EnumSet<E> range(E from, E to)

示例:

EnumSet<Day> workDays = EnumSet.range(Day.MONDAY, Day.FRIDAY);

2.5 add 方法

add 方法用于向集合中添加一个枚举值。

public boolean add(E e)

示例:

EnumSet<Day> days = EnumSet.noneOf(Day.class);
days.add(Day.MONDAY);

2.6 remove 方法

remove 方法用于从集合中移除一个枚举值。

public boolean remove(Object o)

示例:

EnumSet<Day> days = EnumSet.of(Day.MONDAY, Day.WEDNESDAY);
days.remove(Day.MONDAY);

2.7 contains 方法

contains 方法用于判断集合中是否包含指定的枚举值。

public boolean contains(Object o)

示例:

EnumSet<Day> days = EnumSet.of(Day.MONDAY, Day.WEDNESDAY);
boolean hasMonday = days.contains(Day.MONDAY);

3. 使用示例

以下是使用 EnumSet 类进行基本操作的示例代码:

3.1 定义枚举类型

public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

3.2 创建和操作 EnumSet

import java.util.EnumSet;public class EnumSetExample {public static void main(String[] args) {// 创建一个包含指定枚举值的 EnumSetEnumSet<Day> days = EnumSet.of(Day.MONDAY, Day.WEDNESDAY);// 添加枚举值days.add(Day.FRIDAY);System.out.println("Days after adding Friday: " + days);// 移除枚举值days.remove(Day.MONDAY);System.out.println("Days after removing Monday: " + days);// 判断是否包含枚举值boolean hasWednesday = days.contains(Day.WEDNESDAY);System.out.println("Contains Wednesday: " + hasWednesday);// 创建包含所有枚举值的 EnumSetEnumSet<Day> allDays = EnumSet.allOf(Day.class);System.out.println("All Days: " + allDays);// 创建一个空的 EnumSetEnumSet<Day> noDays = EnumSet.noneOf(Day.class);System.out.println("No Days: " + noDays);// 创建一个范围 EnumSetEnumSet<Day> workDays = EnumSet.range(Day.MONDAY, Day.FRIDAY);System.out.println("Work Days: " + workDays);}
}

运行上述代码,将输出:

Days after adding Friday: [MONDAY, WEDNESDAY, FRIDAY]
Days after removing Monday: [WEDNESDAY, FRIDAY]
Contains Wednesday: true
All Days: [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
No Days: []
Work Days: [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]

4. 应用场景

4.1 标志位处理

在处理标志位时,可以使用 EnumSet 存储不同的标志,确保代码的可读性和类型安全。

4.2 配置选项

在处理配置选项时,可以使用 EnumSet 存储不同的配置选项,确保代码的清晰和易于维护。

4.3 状态管理

在状态管理中,可以使用枚举类型表示不同的状态,通过 EnumSet 来存储当前的状态集合。

5. 性能考虑

使用 EnumSet 类进行集合操作时,需要注意以下几点:

  • 高效性EnumSet 在内部使用位向量实现,访问速度快,适合在性能要求高的场景中使用。
  • 内存占用EnumSet 相比于其他集合类更加节省内存,适合在内存受限的场景中使用。
  • 类型安全EnumSet 强制要求元素为枚举类型,避免了类型转换错误,提高了代码的健壮性。

6. 与 HashSet 的比较

虽然 EnumSetHashSet 都实现了 Set 接口,但在某些场景下使用 EnumSet 更为合适。

6.1 性能

EnumSet 的性能比 HashSet 更高,因为它使用位向量实现,时间复杂度为 O(1)。而 HashSet 使用散列表实现,时间复杂度在平均情况下也是 O(1),但在最坏情况下可能会降为 O(n)。

6.2 内存占用

EnumSet 的内存占用比 HashSet 更小,因为它使用紧凑的位向量来存储元素,而 HashSet 使用散列表,可能会有较多的空槽位。

6.3 类型安全

EnumSet 强制元素为枚举类型,避免了类型转换错误,提高了代码的健壮性和可读性。而 HashSet 的元素可以是任意类型,可能会导致类型转换错误。

7. 总结

EnumSet 类在 Java 中提供了一个高效、类型安全的工具,用于存储枚举类型的集合。

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

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

相关文章

CSS 单位中 px、em 和 rem 的区别?

在CSS中&#xff0c;px、em和rem是常用的长度单位&#xff0c;它们之间有一些区别&#xff1a; px&#xff08;像素&#xff09;&#xff1a; px是相对长度单位&#xff0c;它是相对于显示器屏幕分辨率的一个点的大小。 px单位是固定的&#xff0c;不会随着父元…

代码随想录算法训练营第五十二天(图论)| 98. 所有可达路径、深度优先搜索、广度优先搜索

邻接矩阵 邻接矩阵是一种使用二维数组来表示图的方法。矩阵中的元素表示节点之间是否存在边。如果存在边&#xff0c;则对应的矩阵元素为1&#xff08;或边的权重&#xff09;&#xff1b;否则为0。 特点&#xff1a; 空间复杂度高&#xff1a;无论图是否稀疏&#xff0c;邻…

前端Canvas入门——一些注意事项

创建渐变的三种方法&#xff1a; createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变&#xff08;放射性渐变&#xff09; createConicGradient() - 锥形渐变 这三种的核心观点都是&#xff1a; 创建一个gradient对象&#xff0c;然后调用addColorStop()方法…

【java】力扣 合并两个有序链表

文章目录 题目描述题目链接思路代码 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题目链接 21. 合并两个有序链表 思路 先定义一个哨兵节点dummy&#xff0c;为了方便解题 然后定义一个节点pre&#xff0…

paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境

1.安装英伟达显卡驱动 首先需要到NAVIDIA官网去查自己的电脑是不是支持GPU运算。 网址是&#xff1a;CUDA GPUs | NVIDIA Developer。打开后的界面大致如下&#xff0c;只要里边有对应的型号就可以用GPU运算&#xff0c;并且每一款设备都列出来相关的计算能力&#xff08;Compu…

模板方法模式的实现

1. 引言: 交易管理系统中的模板方法模式 之前做过一个交易管理系统&#xff0c;其中有一个核心模块是“交易流程管理”&#xff0c;该模块需要处理不同类型的交易&#xff0c;比如期货交易、期权交易和股票交易。在构建交易管理系统的过程中&#xff0c;我们面临了一个核心挑战…

为二进制文件添加.gnu_debugdata调试信息

前言 在使用gcc/g编译二进制文件过程中&#xff0c;如果添加了-g参数&#xff0c;编译出来的二进制文件会带有debug信息&#xff0c;供调试使用。但是debug信息往往占用空间很大&#xff0c;导致二进制文件太大&#xff0c;在发布到生产环境时&#xff0c;一般会去掉调试信息&…

(南京观海微电子)——电容应用及选取

什么是电容器&#xff1f; 电容器是一种在内部电场中储存能量的电子器件。它与电阻器、电感器一样&#xff0c;都是基本的无源电子元件。所有电容器都具有相同的基本结构&#xff0c;两块导电极板中间由绝缘体隔开&#xff0c;该绝缘体称为电介质&#xff0c;可在施加电场后发…

时间轮算法理解、Kafka实现

概述 TimingWheel&#xff0c;时间轮&#xff0c;简单理解就是一种用来存储若干个定时任务的环状队列&#xff08;或数组&#xff09;&#xff0c;工作原理和钟表的表盘类似。 关于环形队列&#xff0c;请参考环形队列。 时间轮由两个部分组成&#xff0c;一个环状数组&…

一文了解MySQL的表级锁

文章目录 ☃️概述☃️表级锁❄️❄️介绍❄️❄️表锁❄️❄️元数据锁❄️❄️意向锁⛷️⛷️⛷️ 介绍 ☃️概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0…

Coze:如何使用团队空间?

你好&#xff0c;我是三桥君 团队空间&#xff0c;是一个允许我们组建团队并共享机器人、插件等资源的功能。 好的&#xff0c;让我们开始创建一个团队。我们将这个团队命名为“三桥君AI”&#xff0c;并在描述中也填写“这里是关于“三桥君AI”团队的描述”。点击确定后&…

VMware_centos8安装

目录 VMware Workstation Pro的安装 安装centos VMware Workstation Pro的安装 正版VMware 17百度网盘下载链接 (含秘钥) 链接&#xff1a;https://pan.baidu.com/s/16zB-7IAACM_1hwR1nsk12g?pwd1111 提取码&#xff1a;1111 第一次运行会要求输入秘钥 秘钥在上边的百度网盘…

【CUDA|CUDNN】安装

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 显卡驱动安装参考之前的文章 cuda、cudnn 安装 1. cuda 安装 访问https://developer.nvidia.com/cuda-toolkit-archive 选择需要的版本&#xff1a;h…

Selenium使用注意事项:

find_element 和 find_elements 的区别 WebDriver和WebElement的区别 问题&#xff1a; 会遇到报错&#xff1a; selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector",&…

双管正激小功率电源的设计与实现

正激变换由于拓扑简单&#xff0c; 升/ 降压范围宽&#xff0c; 广泛应用于中小功率电源变换场合。正激变换器的输出功率不象反激变换器那样受变压器储能的限制&#xff0c; 因此输出功率较反激变换器大&#xff0c; 但是正激变换器的开关管电压应力高&#xff0c; 为两倍输入电…

php探针

php探针是用来探测空间、服务器运行状况和PHP信息用的&#xff0c;探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息。 下面就分享下我是怎样利用php探针来探测服务器网站空间速度、性能、安全功能等。 具体步骤如下&#xff1a; 1.从网上下…

视频监控汇聚平台:通过SDK接入大华DSS视频监控平台的源代码解释和分享

目录 一、视频监控汇聚平台 1、概述 2、视频接入能力 3、视频汇聚能力 二、大华DSS平台 1、DSS平台概述 2、大华DSS平台的主要特点 &#xff08;1&#xff09;高可用性 &#xff08;2&#xff09;高可靠性 &#xff08;3&#xff09;易维护性 &#xff08;4&#xf…

【Mongodb-04】Mongodb聚合管道操作基本功能

Mongodb系列整体栏目 内容链接地址【一】Mongodb亿级数据性能测试和压测https://zhenghuisheng.blog.csdn.net/article/details/139505973【二】springboot整合Mongodb(详解)https://zhenghuisheng.blog.csdn.net/article/details/139704356【三】亿级数据从mysql迁移到mongodb…

SpringCloud第三篇(服务中心与OpenFeign)

p 文章目录 一、服务中心二、Nacos注册中心 一、服务中心 在上一章我们实现了微服务拆分&#xff0c;并且通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题。 试想一下&#xff0c;假如商品微服务被调用较多&#xff0c;为了应对更高的并发…

如何把pickle文件转为txt格式

import pickle import json import argparsedef pickle_to_text(pickle_file, output_file):# 加载pickle文件with open(pickle_file, rb) as f:data pickle.load(f)# 将数据转换为JSON格式的字符串data_str json.dumps(data, defaultlambda o: o.__dict__, indent4)# 将字符…