因为我没有收到回答我的问题在哪一个更有效,我决定做一些我自己的测试。
我测试了迭代values()
,Arrays.asList(values())
和EnumSet.allOf()
。 我已经为不同的枚举大小重复了10,000,000次这些测试。以下是测试结果:
oneValueEnum_testValues 1.328
oneValueEnum_testList 1.687
oneValueEnum_testEnumSet 0.578
TwoValuesEnum_testValues 1.360
TwoValuesEnum_testList 1.906
TwoValuesEnum_testEnumSet 0.797
ThreeValuesEnum_testValues 1.343
ThreeValuesEnum_testList 2.141
ThreeValuesEnum_testEnumSet 1.000
FourValuesEnum_testValues 1.375
FourValuesEnum_testList 2.359
FourValuesEnum_testEnumSet 1.219
TenValuesEnum_testValues 1.453
TenValuesEnum_testList 3.531
TenValuesEnum_testEnumSet 2.485
TwentyValuesEnum_testValues 1.656
TwentyValuesEnum_testList 5.578
TwentyValuesEnum_testEnumSet 4.750
FortyValuesEnum_testValues 2.016
FortyValuesEnum_testList 9.703
FortyValuesEnum_testEnumSet 9.266
这些是从命令行运行的测试结果。当我从Eclipse中运行这些测试时,我得到了对testValues
的支持。基本上它小于EnumSet
,即使对于小枚举也是如此。我相信性能增益来自for (val : array)
循环中数组迭代器的优化。另一方面,只要您需要java.util.Collection传递,Arrays.asList()
就会丢失到EnumSet.allOf
,特别是对于小枚举,我相信它会在任何给定代码库中占多数。
所以,我会说你应该使用
for (final MyEnum val: MyEnum.values())
但
Iterables.filter(
EnumSet.allOf(MyEnum.class),
new Predicate<MyEnum>() {...}
)
而且只使用Arrays.asList(MyEnum.values())
那里是绝对必要的java.util.List
。
@ alexander-pogrebnyak,将其标记为答案 – GetUsername 2011-03-31 14:03:05
@GetUsername不想在没有人投票的情况下做:D – 2011-03-31 17:44:54
很好的答案+1 – PiersyP 2013-06-25 20:57:33