使用enum的arraylist进行条件检查时的效率

时间:2016-04-01 12:28:48

标签: java

在我的情况下,给定一个枚举,检查该枚举是否属于特定的枚举列表。

我的解决方案是将我要与给定枚举进行比较的所有枚举放到ArrayList中。所以我可以使用ArrayList的contains(..)方法来执行检查任务。

PokemonEnums givenPokemon = ...;

ArrayList<PokemonEnums> AshPokemonList = ...;

while(doing something){
      if(AshPokemonList.contains(givenPokemon){
           //do fun stuffs
      }
}

在表现方面是否可以接受,还是以其他方式我可以更优雅的方式做到这一点?

P / S:虽然我知道AshPokemonList可能不会包含更多10个,但我可以使用if进行多次检查,但是对我来说它看起来很麻烦。但我不知道在性能方面,它会更好吗?

3 个答案:

答案 0 :(得分:6)

Java提供了一个名为EnumSet<T>的特殊容器,该容器针对使用enum进行了优化:

PokemonEnums givenPokemon = ...;
EnumSet<PokemonEnums> ashPokemonSet = ...;
while(doing something){
      if(ashPokemonSet.contains(givenPokemon) {
           //do fun stuffs
      }
}

这个实现应该比数组列表更好,因为它在内部使用位向量:

  

枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足以使其成为传统的基于int的“位标志”的高质量,类型安全的替代品。

答案 1 :(得分:3)

不,它不是“可接受的”,因为它具有线性复杂性,因此运行时间取决于列表的长度。 请改用EnumSet。这个类没有排序,但你可以在恒定时间内检查是否包含枚举,无论集合有多大。

答案 2 :(得分:0)

请使用EnumSet:https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html。这是专门为Enums创建的东西。空间和性能方面,非常好。

从API复制粘贴:

  

与枚举类型一起使用的专用Set实现。全部   枚举集中的元素必须来自单个枚举类型   创建集时,显式或隐式指定。枚举   集合在内部表示为位向量。这种表示是   非常紧凑和高效。时空的表现   这个课程应该足够好,可以让它作为高品质使用,   类型安全替代传统的基于int的“位标志”。甚至批量   操作(例如containsAll和retainAll)应该非常快速地运行   如果他们的论点也是一个枚举集。