因为我没有得到我的问题的答案,即哪个更有效率,所以我决定自己进行一些测试。
我测试了对 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 >( ) {...}
)
仅在确实需要使用java.util.List
的情况下,才使用Arrays.asList(MyEnum.values())
。