如何通过 EnumSet.allOf() 方法高效获取 Java 枚举类所有常量集合?

2026-05-03 01:542阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计878个文字,预计阅读时间需要4分钟。

如何通过 EnumSet.allOf() 方法高效获取 Java 枚举类所有常量集合?

`EnumSet.allOf()` 方法只能用于枚举类型,且必须传入该枚举的 `Class` 对象。它底层依赖于枚举类的 `values()` 方法。因此,要求枚举类型不能是匿名子类或动态生成的(如反射构造的)。否则,会抛出 `IllegalArgumentException`。

  • 必须传入具体枚举类的 Class,例如 Color.class,不能传 Object.class 或父类
  • 枚举类中不能有未初始化的字段(如在 static 块中抛异常),否则 allOf() 调用时可能触发 ExceptionInInitializerError
  • 返回的是不可变结构但可变内容的集合——你不能 add()remove(),但可以 clear()(清空后集合变空,不再是“全量”)

为什么不用 values() 直接转 List 而要用 EnumSet.allOf()?

EnumSet 是专门为枚举设计的高性能集合实现,底层用位向量(longlong[])表示,空间占用极小、遍历和 contains 操作都是 O(1)。而 Arrays.asList(Color.values()) 返回的是固定大小的 ArrayList,既不支持增删,又没做位运算优化。

阅读全文
标签:Java

本文共计878个文字,预计阅读时间需要4分钟。

如何通过 EnumSet.allOf() 方法高效获取 Java 枚举类所有常量集合?

`EnumSet.allOf()` 方法只能用于枚举类型,且必须传入该枚举的 `Class` 对象。它底层依赖于枚举类的 `values()` 方法。因此,要求枚举类型不能是匿名子类或动态生成的(如反射构造的)。否则,会抛出 `IllegalArgumentException`。

  • 必须传入具体枚举类的 Class,例如 Color.class,不能传 Object.class 或父类
  • 枚举类中不能有未初始化的字段(如在 static 块中抛异常),否则 allOf() 调用时可能触发 ExceptionInInitializerError
  • 返回的是不可变结构但可变内容的集合——你不能 add()remove(),但可以 clear()(清空后集合变空,不再是“全量”)

为什么不用 values() 直接转 List 而要用 EnumSet.allOf()?

EnumSet 是专门为枚举设计的高性能集合实现,底层用位向量(longlong[])表示,空间占用极小、遍历和 contains 操作都是 O(1)。而 Arrays.asList(Color.values()) 返回的是固定大小的 ArrayList,既不支持增删,又没做位运算优化。

阅读全文
标签:Java