JAVA中两个专门操作枚举类型的容器类

java中有两个容器EnumSetEnumMap,他们专门是为枚举类型专门设计的,所以在操作枚举类型方面,比一般的容器类更加的高效。下面只是对这两个类的细节进行说明,至于这两个类的其他方法,参见官方文档:

http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html

http://docs.oracle.com/javase/7/docs/api/java/util/EnumMap.html

 

注意:普通的MapSet也可以用来放枚举类型,但是用这两个类会更加的高效和节省空间。这里两个类都不是线程安全的。

 

EnumSetEnumSet和普通的Set差不多,但是他是专门用来存放枚举类型的数据的(枚举类型都是有限的)。所以他的内部是由一个bit vector来放这些枚举类型的对象的,这就使得用这个类来放枚举类型更加的高效和节省空间,每个枚举类型具体放在bit vector的哪个位置是通过这些枚举类型的ordinal()方法来确定的,所以,如果我们遍历这个EnumSet,它输出的对象的顺序就是这些枚举类型的对象声明时候的顺序。EnumSet的遍历可以通过iterator或者增强的for进行遍历。最后,这个类的对象的创建不是通过new,而是大量的static factory method创建的。

 

EnumMap:这个类是创建一个以枚举类型作为键,其他类型作为值的一个map。和EnumSet一样,他也是借助枚举类型的ordinal()方法来计算“枚举类型的键”放在数组中的哪个位置的,所以他的内部是由一个数组来维护的。这个类的对象的创建是用new来创建的。遍历EnumMap我们可以通过遍历它的Key(使用keySet()返回他的key值,或者用对于枚举类型的values()返回所有的枚举类型对象),然后通过get()方法传入一个Key值,返回对应的Value值(他变量和普通的Map差不多)。

 

从上面我们也可以看出ordinal()方法的用途,其实ordinal()方法对于我们而言用处不大,主要就是在维护EnumMap或者EnumSet的时候,或者我们自己创建了一个类似的容器的时候才有用。所以尽量避免使用ordinal()方法,如果我们需要得到每个Enum类型的对象对于的int值的话,我们就自己加一个变量,在声明Enum对象的时候通过构造函数传一个值进来,需要的时候将这个值返回就好了。比如下面的例子:


private static enum Digit {
		ZERO(0), ONE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9);
		
		private final int val;
		private Digit(int val) {
			this.val = val;
		}
		
		/* 通过这个方法返回Digit类型的对象的值,而不知ordinal()方法.
		 * 因为ordinal()方法返回的值是和这些对象声明时候的顺序是有关的.
		 * 如果我们改变了声明的顺序,那么ordinal()方法返回的值就变了。*/
		int getVal() {
			return val;
		}
}

 

如何创建线程安全的EnumSet(其实返回的是一个普通的Set)和EnumMap(其实返回的是一个普通的Map)?

 

线程安全的Set,里面放的数据是Enum类型的:

Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));

 

线程安全的Map,里面放的数据是Enum类型的:

Map<EnumKey, V>  m  =  Collections.synchronizedMap(new EnumMap<EnumKey, V>(...));

 

 

 

<think>嗯,用户问的是Java中的枚举类是否属于集合类型。我需要先弄清楚枚举类和集合各自的定义和用途。根据引用[1]和[2],枚举是一种特殊的类,用于定义一组常量。而集合,比如List、Set,是用来存储和操作多个元素的容器。所以,枚举本身并不是集合类型,它更像是一种常量集合的定义方式。 不过,引用[3]提到,在枚举中可以结合集合操作,比如EnumSetEnumMap,这些是专门为枚举设计的集合类。这说明虽然枚举类本身不是集合,但Java提供了特定的集合类来配合枚举使用,提升效率和类型安全。因此,需要明确区分枚举类和枚举集合类。用户可能混淆了这两个概念,需要解释清楚两者的关系,并举例说明EnumSet的用法,帮助用户理解如何将枚举与集合结合使用。同时,引用[4]指出枚举适合表示固定常量集合,这进一步说明枚举类本身并不是集合类型,但可以用于集合的场景。总结来说,枚举类和集合类型是不同的概念,但可以结合使用。</think>Java中的枚举类(Enum)**不属于集合类型**,但可以与集合类型(如`EnumSet`、`EnumMap`)结合使用。以下是具体分析: --- ### 1. **枚举类的本质** 枚举是一种特殊的类,用于定义一组**固定常量**,每个常量都是枚举类的实例。例如: ```java public enum Color { RED, GREEN, BLUE } ``` 这里`Color`枚举类定义了三个常量,每个常量都是`Color`类型的对象,而非集合元素[^1][^2]。 --- ### 2. **集合类型的定义** 集合(如`List`、`Set`、`Map`)是用于存储和操作多个元素的容器。例如: ```java Set<String> colors = new HashSet<>(); colors.add("RED"); ``` 集合的核心功能是**动态管理元素**,而枚举类的核心是**定义有限且固定的常量**[^3]。 --- ### 3. **枚举与集合的结合** 虽然枚举类本身不是集合,但Java提供了专门针对枚举的集合类: - **`EnumSet`**:高性能的枚举专用集合,内部用位向量实现,适用于枚举常量的高效操作。 ```java EnumSet<Color> colors = EnumSet.of(Color.RED, Color.GREEN); ``` - **`EnumMap`**:键为枚举类型的映射表,直接通过枚举常量索引,避免哈希冲突。 ```java EnumMap<Color, String> colorNames = new EnumMap<>(Color.class); colorNames.put(Color.RED, "红色"); ``` 这些集合类依赖枚举类型的特性,但枚举类本身仍独立于集合类型[^4]。 --- ### 4. **关键区别** | **特性** | 枚举类 | 集合类型 | |------------------|-------------------------|------------------------| | 核心目的 | 定义固定常量 | 存储和管理动态元素 | | 元素可变性 | 常量不可变 | 元素可动态增删 | | 类型安全性 | 强类型(编译时检查) | 依赖泛型 | | 内存效率 | 单例实例,内存占用低 | 动态分配,占用较高 | --- ### 总结 枚举类与集合类型是**互补关系**而非从属关系: - 枚举类用于定义固定常量集合,强调类型安全和有限性[^4]。 - 集合类型用于动态管理数据,而`EnumSet`/`EnumMap`是专为枚举优化的工具类。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值