java 中的枚举值列表tl;博士详Enum.values EnumSet– 快速和小自然秩序
是否可以创建枚举值的 ArrayList(并对其进行操作)?例如:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
是否可以创建枚举值的 ArrayList(并对其进行操作)?例如:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
你可以简单地写
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
是否可以从枚举创建和编辑对象集合?是的。
如果您不关心顺序,请使用 EnumSet
,即 Set
的实现。
enum Animal{ DOG , CAT , BIRD , BAT ; }
Set<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
Set<Animal> featheredFlyingAnimals = flyingAnimals.clone().remove( BAT ) ;
如果您关心顺序,请使用 List
实现,如 ArrayList
。例如,我们可以按照一个人在选择宠物时的偏好顺序创建一个列表。
List< Animal > favoritePets = new ArrayList<>() ;
favoritePets.add( CAT ) ; // This person prefers cats over dogs…
favoritePets.add( DOG ) ; // …but would accept either.
// This person would not accept a bird nor a bat.
对于不可修改的有序列表,请使用 List.of
。
List< Animal > favoritePets = List.of( CAT , DOG ) ; // This person prefers cats over dogs, but would accept either. This person would not accept a bird nor a bat.
Amit Deshpande的答案()和Marko Topolnik的答案()都是正确的。以下是更多信息。EnumSet
.values
Enum.values
该方法是 Enum
上隐式声明的方法,由编译器添加。它生成一个粗略的数组,而不是一个集合
。当然可用。.values()
关于文档的特别说明:作为隐式声明的方法,该方法不常见,因此未在类上的方法中列出。该方法在 Java 语言规范中定义,并在 Enum.valueOf 的文档
中提到。.values()
Enum
EnumSet
– 快速和小EnumSet
的优点包括:
引用类文档:
枚举集在内部表示为位向量。这种表示非常紧凑和高效。此类的空间和时间性能应该足够好,以允许将其用作传统的基于 int 的“位标志”的高质量、类型安全的替代方案。即使批量操作(如 containsAll 和 retainAll)的参数也是枚举集,也应该运行得非常快。
给定此枚举:
enum Animal
{
DOG , CAT , BIRD , BAT ;
}
在一行中制作一个。EnumSet
Set<Animal> allAnimals = EnumSet.allOf( Animal.class );
转储到控制台。
System.out.println( "allAnimals : " + allAnimals );
所有动物 : [狗, 猫, 鸟, 蝙蝠]
从枚举对象的子集创建一个集合。
Set<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
查看类文档,了解操作集合的许多方法,包括添加或删除元素。
Set<Animal> featheredFlyingAnimals =
EnumSet.copyOf( flyingAnimals ).remove( BAT );
该文档承诺 EnumSet 的迭代器是自然顺序,即枚举值最初声明的顺序。
引用类文档:
迭代器方法返回的迭代器按元素的自然顺序(枚举常量的声明顺序)遍历元素。
坦率地说,鉴于这个承诺,我很困惑为什么这不是一个排序集
。但是,哦,好吧,够好了。如果需要,我们可以从 中创建一个列表
。将 any 传递给 的构造函数,该集合的迭代器
将自动代表您调用。Set
Collection
ArrayList
List<Animal> list = new ArrayList<>( allAnimals );
转储到控制台。
System.out.println("list : " + list );
运行时。
list : [DOG, CAT, BIRD, BAT]
在 Java 10 及更高版本中,您可以通过传递 来方便地创建不可修改的 .新列表的顺序将按 的迭代器顺序排列。的迭代器顺序是在枚举上定义枚举的元素对象的顺序。List
EnumSet
EnumSet
EnumSet
List< Animal > nonModList = List.copyOf( allAnimals ) ; // Or pass Animals.values()