EnumSet是否支持按传入顺序返回集合元素?
问题解答
为什么EnumSet遍历顺序不符合传入顺序?
EnumSet的核心特性是严格遵循枚举类中常量的自然定义顺序,和你在EnumSet.of()方法中传入的参数顺序完全无关。它的底层实现依赖枚举的ordinal值(每个枚举常量的声明顺序索引)来排序,所以遍历输出的顺序永远是枚举类里常量的声明顺序。
两种解决办法
方法一:调整枚举类的常量顺序
如果允许修改枚举类的定义,直接把TYPE_1、TYPE_2、TYPE_3按你想要的顺序声明在枚举类中:public enum YourEnumType { TYPE_1, TYPE_2, TYPE_3, // 其他枚举常量... }此时不管
EnumSet.of()里的传入顺序如何,遍历都会遵循枚举类的声明顺序,也就是你期望的顺序。方法二:改用LinkedHashSet保持插入顺序
如果无法修改枚举类的顺序,就放弃使用EnumSet,改用LinkedHashSet——它是HashSet的子类,能够严格保持元素的插入顺序。修改你的getter方法:import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; public static Set<T> getTypes() { return new LinkedHashSet<>(Arrays.asList( TYPE_1, TYPE_2, TYPE_3 )); }若使用Java 9及以上版本,也可以用更简洁的写法:
import java.util.Set; import java.util.stream.Collectors; import java.util.LinkedHashSet; public static Set<T> getTypes() { return Set.of(TYPE_1, TYPE_2, TYPE_3) .stream() .collect(Collectors.toCollection(LinkedHashSet::new)); }注意:LinkedHashSet不具备EnumSet的高效位存储特性,但能满足你对遍历顺序的要求。
内容的提问来源于stack exchange,提问作者alexsk_1
相关产品推荐
相关产品推荐

