java枚举类自带静态values()方法,返回按声明顺序排列的新建枚举常量数组,支持增强for或stream遍历;注意其性能开销、不可缓存及线程安全问题。

Java 中枚举类自带 values() 方法,它返回一个包含该枚举所有常量的数组,可以直接用于遍历。
values() 方法的基本用法
values() 是编译器为每个枚举类自动生成的静态方法,返回类型是 枚举名[]。它按声明顺序返回所有枚举常量,不可修改,也不支持泛型参数。
- 调用方式:直接通过枚举类名调用,如
Color.values() - 返回值:一个新创建的数组(每次调用都新建,不缓存)
- 注意:不能在枚举实例内部或构造器中调用
values(),否则会触发初始化循环导致ExceptionInInitializerError
常用遍历方式示例
最常见的是用增强 for 循环遍历:
enum Color {
RED, GREEN, BLUE;
}
// 遍历所有枚举常量
for (Color c : Color.values()) {
System.out.println(c); // 输出:RED、GREEN、BLUE
}
也可以配合 Stream 处理:
Arrays.stream(Color.values())
.forEach(System.out::println);
values() 和 valueOf() 的区别
values() 返回全部常量数组;valueOf(String) 则根据名称查找单个枚举实例。
-
Color.values()→{RED, GREEN, BLUE} -
Color.valueOf("RED")→RED(大小写敏感,不存在抛IllegalArgumentException)
实际使用中的注意事项
虽然方便,但要注意性能和线程安全:
- 每次调用
values()都会创建新数组,高频场景可考虑缓存(如用static final数组保存) - 返回的数组本身是不可变的(内容不可改),但数组引用可被重新赋值,所以不要暴露给外部修改
- 若枚举常量较多,且只关心部分属性(如 name 或自定义字段),建议提前投影成更轻量结构,避免反复访问枚举实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











