Java EnumSet 类:初学者全面指南

引言

你好,有抱负的Java程序员!今天,我们将深入探讨Java中的EnumSet奇妙世界。如果你是编程新手,不用担心——我将作为你友好的向导,一步一步地解释这一切。在本教程结束时,你将成为EnumSet的专家!

Java - EnumSet

EnumSet是专门为枚举类型使用的Set实现。它就像一个秘密俱乐部,只有枚举常量才被允许加入!想象一下,你正在组织一个派对,并且有一系列不同类型的小吃。EnumSet非常适合用来跟踪你决定提供哪些小吃。

类声明

在我们开始使用EnumSet之前,先来看看它的声明:

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable

看起来很复杂!但别担心,我们会分解它:

  • public abstract class:这意味着EnumSet是其他类的蓝图,但我们不能直接创建一个EnumSet。
  • <E extends Enum<E>>:这个花哨的表示告诉我们EnumSet适用于枚举类型。
  • extends AbstractSet<E>:EnumSet是一种Set,从AbstractSet继承行为。
  • implements Cloneable, Serializable:这些是EnumSet具有的特殊能力,比如能够创建自身的副本或将其保存到文件中。

类方法

现在,让我们看看EnumSet最重要的方法。我会在表格中展示它们,便于参考:

方法 描述
allOf(Class<E> elementType) 创建一个包含指定枚举类型的所有元素的EnumSet
complementOf(EnumSet<E> s) 创建一个包含指定集合中不存在的所有元素的EnumSet
copyOf(Collection<E> c) 从给定的Collection创建一个EnumSet
noneOf(Class<E> elementType) 创建一个指定枚举类型的空EnumSet
of(E e) 创建一个包含单个指定元素的EnumSet
of(E e1, E e2, ...) 创建一个包含两个或更多指定元素的EnumSet
range(E from, E to) 创建一个包含枚举常量范围的EnumSet

如果这些看起来让人不知所措——别担心,我们很快就会看到如何使用它们的例子!

继承的方法

EnumSet还从其父类继承了方法。以下是一些最有用的:

方法 继承自 描述
add(E e) AbstractSet 向集合中添加一个元素
remove(Object o) AbstractSet 从集合中移除一个元素
contains(Object o) AbstractSet 检查集合是否包含特定元素
size() AbstractCollection 返回集合中的元素数量
isEmpty() AbstractCollection 检查集合是否为空
clear() AbstractCollection 从集合中移除所有元素

创建EnumSet示例

现在,让我们用一个有趣的例子来实践我们所学的知识。想象一下,我们正在计划一个为期一周的假期,并想跟踪我们将在哪些天旅行。我们将使用枚举来表示一周中的每一天,并使用EnumSet来管理我们的旅行日。

首先,定义我们的枚举:

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

现在,让我们创建一些EnumSets并玩弄它们:

import java.util.EnumSet;

public class VacationPlanner {
public static void main(String[] args) {
// 创建一个包含一周所有天的EnumSet
EnumSet<DayOfWeek> allDays = EnumSet.allOf(DayOfWeek.class);
System.out.println("所有天: " + allDays);

// 创建一个只包含周末的EnumSet
EnumSet<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
System.out.println("周末: " + weekend);

// 创建一个包含工作日的EnumSet
EnumSet<DayOfWeek> weekdays = EnumSet.complementOf(weekend);
System.out.println("工作日: " + weekdays);

// 计划一个3天的旅行
EnumSet<DayOfWeek> tripDays = EnumSet.of(DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
System.out.println("旅行日: " + tripDays);

// 检查我们的旅行是否包括周一
boolean includesMonday = tripDays.contains(DayOfWeek.MONDAY);
System.out.println("我们的旅行包括周一吗? " + includesMonday);

// 向我们的旅行中添加一天
tripDays.add(DayOfWeek.THURSDAY);
System.out.println("更新后的旅行日: " + tripDays);

// 从我们的旅行中移除一天
tripDays.remove(DayOfWeek.THURSDAY);
System.out.println("最终的旅行日: " + tripDays);
}
}

让我们分解一下这段代码中发生了什么:

  1. 我们使用EnumSet.allOf()创建一个包含一周所有天的EnumSet。
  2. 我们使用EnumSet.of(),带有两个特定天,创建一个周末的EnumSet。
  3. 我们使用EnumSet.complementOf()创建一个工作日的EnumSet,它给我们所有不在周末集合中的天。
  4. 我们使用EnumSet.of(),带有三个特定天,计划一个3天的旅行。
  5. 我们使用contains()方法检查我们的旅行是否包括周一。
  6. 我们使用add()方法将周四添加到我们的旅行中。
  7. 最后,我们使用remove()方法将周四从我们的旅行中移除。

当你运行这段代码时,你将在每个步骤中看到EnumSets的打印输出,显示当我们修改它们时它们是如何变化的。

EnumSet对于处理枚举类型非常高效。它内部使用位向量,这意味着添加、移除和检查包含等操作都非常快!

记住,熟能生巧。尝试创建自己的枚举并使用EnumSet。也许你可以计划一周的菜单,跟踪你每天要做的饭菜。或者创建一个学习计划的任务列表。可能性是无限的!

希望这个教程能帮助你更好地理解EnumSet。继续编码,保持好奇心,Java编程快乐!

Credits: Image by storyset