Java EnumSet 类:初学者全面指南
引言
你好,有抱负的Java程序员!今天,我们将深入探讨Java中的EnumSet奇妙世界。如果你是编程新手,不用担心——我将作为你友好的向导,一步一步地解释这一切。在本教程结束时,你将成为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);
}
}
让我们分解一下这段代码中发生了什么:
- 我们使用
EnumSet.allOf()
创建一个包含一周所有天的EnumSet。 - 我们使用
EnumSet.of()
,带有两个特定天,创建一个周末的EnumSet。 - 我们使用
EnumSet.complementOf()
创建一个工作日的EnumSet,它给我们所有不在周末集合中的天。 - 我们使用
EnumSet.of()
,带有三个特定天,计划一个3天的旅行。 - 我们使用
contains()
方法检查我们的旅行是否包括周一。 - 我们使用
add()
方法将周四添加到我们的旅行中。 - 最后,我们使用
remove()
方法将周四从我们的旅行中移除。
当你运行这段代码时,你将在每个步骤中看到EnumSets的打印输出,显示当我们修改它们时它们是如何变化的。
EnumSet对于处理枚举类型非常高效。它内部使用位向量,这意味着添加、移除和检查包含等操作都非常快!
记住,熟能生巧。尝试创建自己的枚举并使用EnumSet。也许你可以计划一周的菜单,跟踪你每天要做的饭菜。或者创建一个学习计划的任务列表。可能性是无限的!
希望这个教程能帮助你更好地理解EnumSet。继续编码,保持好奇心,Java编程快乐!
Credits: Image by storyset