gpt4 book ai didi

java - Enum.values() 与 EnumSet.allOf()。哪一个更可取?

转载 作者:IT老高 更新时间:2023-10-28 20:24:16 25 4
gpt4 key购买 nike

我查看了 EnumSet.allOf 的底层,它看起来非常高效,尤其是对于值少于 64 个的枚举。

基本上所有集合共享所有可能的枚举值的单个数组,唯一的其他信息是一个位掩码,在 allOf 的情况下一举设置。

另一方面,Enum.values() 似乎有点黑魔法。此外,它返回的是一个数组,而不是一个集合,因此在许多情况下,它必须用 Arrays.asList() 修饰才能在任何需要集合的地方使用。

那么,EnumSet.allOf 是否应该比 Enum.values 更可取?

更具体地说,应该使用哪种形式的 for 迭代器:

for ( final MyEnum val: MyEnum.values( ) );

for ( final MyEnum val: EnumSet.allOf( MyEnum.class ) );

最佳答案

因为我没有收到关于哪个更有效的问题的答案,所以我决定自己做一些测试。

我已经测试了 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 是绝对需要的。

关于java - Enum.values() 与 EnumSet.allOf()。哪一个更可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com