- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我查看了 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/
我们构建了一个基于 Netty/NIO 的服务,我正在考虑将该服务部署到我们的生产环境中。我们部署服务的标准方式是作为 WAR,部署在 Tomcat 中。 当我在这里提出相同的方法时,我得到了“不应该
我是一名优秀的程序员,十分优秀!