解析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) {
        // 创建一个包含指定枚举值的 EnumSet
        EnumSet<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);

        // 创建包含所有枚举值的 EnumSet
        EnumSet<Day> allDays = EnumSet.allOf(Day.class);
        System.out.println("All Days: " + allDays);

        // 创建一个空的 EnumSet
        EnumSet<Day> noDays = EnumSet.noneOf(Day.class);
        System.out.println("No Days: " + noDays);

        // 创建一个范围 EnumSet
        EnumSet<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 中提供了一个高效、类型安全的工具,用于存储枚举类型的集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良月柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值