您可以将a
staticMap<Integer,TestEnum>与
static初始化程序一起使用,该初始化程序将使用
TestEnum由其
number字段键入的值来填充它。
请注意,
findByKey已完成
static,
number也已完成
final。
import java.util.*;public enum TestEnum { ONE(1), TWO(2), SIXTY_NINE(69); private final int number; TestEnum(int number) { this.number = number; } private static final Map<Integer,TestEnum> map; static { map = new HashMap<Integer,TestEnum>(); for (TestEnum v : TestEnum.values()) { map.put(v.number, v); } } public static TestEnum findByKey(int i) { return map.get(i); } public static void main(String[] args) { System.out.println(TestEnum.findByKey(69)); // prints "SIXTY_NINE" System.out.println( TestEnum.values() == TestEnum.values() ); // prints "false" }}您现在可以期望
findByKey是一个
O(1)操作。
参考文献
- JLS 8.7静态初始值设定项
- JLS 8.9枚举
注意 values()
该方法的第二条
println语句
main显示了:
values()每次调用都会返回一个新分配的数组!原始
O(N)解决方案可以通过只调用
values()一次并缓存阵列来做得更好,但是该解决方案仍然是
O(N)平均水平。



