EnumSet and EnumMap EnumSet 是一种专门为枚举类型所设计的 Set 类型。 EnumSet 是抽象类,其有两个实现:RegularEnumSet 、JumboEnumSet,选择哪一个取决于实例化时枚举中常量的数量。 在很多场景中的枚举常量集合操作(如:取子集、增加、删除、containsAll和removeAll批操作)使用EnumSet非常合适;如果需要迭代所有可能的常量则使用Enum.values()。 public class Pizza { private static EnumSet<PizzaStatus> undeliveredPizzaStatuses = EnumSet.of
EnumSet 跟EnumMap很类似,EnumSet是一个set,然后set中的元素都是某个Enum类型。 EnumSet是一个抽象类,要创建EnumSet类可以使用EnumSet提供的两个静态方法,noneOf和allOf。 从上面的代码我们可以看到EnumSet有两个实现,长度大于64的时候使用JumboEnumSet,小有64的时候使用RegularEnumSet。 再看一下allOf: public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) { EnumSet 总结 EnumMap和EnumSet对特定的Enum对象做了优化,可以在合适的情况下使用。
使用EnumSet替代位运算 到这里你可能觉得问题解决了就完了,但是还没有! 内部实现上,每个EnumSet内容都表示为位矢量,一般(低于64个元素)整个EnumSet就是用一个long的位运算来表示的。 下面是用EnumSet修改后的示例代码,它更加简短,清楚也更安全。 // 博客地址:wossoneri.github.io public class UsbManager { private EnumSet<UsbFlags> mUsbState = EnumSet.noneOf 最后,EnumSet类集成了位域自身的简洁性和性能优势,又拥有枚举的所有优点,所以使用它代替位域是非常好的选择。
参考链接: Java EnumSet 原文地址:https://examples.javacodegeeks.com/java-basics/java-enumeration-example/ === Car.valueOf("BMW"), Car.BMW.getPrice()); System.out.println("Size is now: " + cars.size()); } } 3.EnumSet 示例 import java.util.EnumSet; public class EnumSetExample { public static void main(String[] args ) { // Create an EnumSet that contains all days of the week. EnumSet week = EnumSet.allOf(Day.class); // Print the values of an EnumSet.
EnumSet类 EnumSet是一个专为枚举设计的集合类,EnumSet中所有值都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐性的指定。 EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的排序。 EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象。 static EnumSet complementOf(EnumSet s); 创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet,新EnumSet集合包含原EnumSet所不包含的、 static EnumSet copyOf(EnumSet s); 创建一个与指定EnumSet具有相同元素集合类型、相同集合元素的EnumSet。
java中EnumSet的使用
说明
1、EnumSet可以存储一个枚举中的元素,它提供了一种通过集合来操作枚举类的方式。 2、EnumSet中的所有元素都必须指定枚举类型的枚举值,这种枚举类型在创建EnumSet时是显性的或隐性的。
* 就其内部而言,它(可能)就是将一个 long 值作为比特向量,所以 EnumSet 非常快速高效。 */
private static void enumSet() {
// 空构造器
EnumSet<WeekEnum> weekEnums = EnumSet.noneOf weekEnums = EnumSet.complementOf(weekEnums);
System.out.println(weekEnums);
}
以上就是java中EnumSet
EnumSet 跟EnumMap很类似,EnumSet是一个set,然后set中的元素都是某个Enum类型。 EnumSet是一个interface而不是一个类,要创建EnumSet类可以使用EnumSet提供的两个静态方法,noneOf和allOf。 从上面的代码我们可以看到EnumSet有两个实现,长度大于64的时候使用JumboEnumSet,小有64的时候使用RegularEnumSet。 再看一下allOf: public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) { EnumSet 总结 EnumMap和EnumSet对特定的Enum对象做了优化,可以在合适的情况下使用。
下面,我们先来看EnumSet的基本用法,然后通过一个场景来看EnumSet的应用,最后,我们分析EnumSet的实现机制。 基本用法 与TreeSet/HashSet不同,EnumSet是一个抽象类,不能直接通过new新建,也就是说,类似下面代码是错误的: EnumSet<Size> set = new EnumSet<Size >(); 不过,EnumSet提供了若干静态工厂方法,可以创建EnumSet类型的对象,比如: public static <E extends Enum<E>> EnumSet<E> noneOf( 创建的EnumSet对象的实际类型是EnumSet的子类,待会我们再分析其具体实现。 <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) <E extends Enum<E>> EnumSet<E> copyOf(Collection
EnumSet EnumSet是Java Set接口的一个特别实现,在JDK 1.5中开始支持,Enum类型也正式引入到了Java中。 What is EnumSet EnumSet是Set接口的一个实现,它只能用来存储Enum常量或其子类,不能存储其它类型。EnumSet是设计模式中工厂方法创建实例的一个很好例子。 EnumSet中提供了多种创建EnumSet实例的静态工厂方法,例如of方法(进行了函数重载),copyOf方法,noneOf方法等。 3. Important points about EnumSet 一个EnumSet中只能包含一种枚举类型。 EnumSet中不能放入null元素,放入会抛出空指针异常。 EnumSet是线程非安全的。 Source Code of EnumSet EnumSet: public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<
创建EnumSet并不能使用new关键字,因为它是个抽象类,而应该使用其提供的静态工厂方法,EnumSet的静态工厂方法比较多,如下: // 创建一个具有指定元素类型的空EnumSet。 rest) //创建一个包含参数容器中的所有元素的EnumSet <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) <E extends Enum //指定补集,也就是从全部枚举类型中去除参数集合中的元素,如下去掉上述enumSet2的元素 EnumSet<Color> enumSet3= EnumSet.complementOf //复制enumSet5容器的数据作为初始化数据 EnumSet<Color> enumSet6= EnumSet.copyOf(enumSet5); System.out.println enumSet7=EnumSet.copyOf(list); System.out.println("enumSet7:"+enumSet7.toString());
API:java.util.TreeSet EnumSet 类 EnumSet 是一个专为枚举类设计的集合类, EnumSet 中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建 EnumSet EnumSet 类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的类方法来创建 EnumSet对象 。 EnumSet 类它提供了如下常用的类方法来创建 EnumSet 对象 : EnumSet allOf(Class elementType): 创建一个包含指定枚举类里所有枚举值的 EnumSet 集合 EnumSet complementOf(EnumSet s): 创建一个其元素类型与指定 EnumSet 里元素类型相同的 *EnumSet 集合,新 EnumSet 集合包含原 EnumSet 集合所不包含的 EnumSet copyOf(EnumSet s): 创建一个与指定 EnumSet 具有相同元素类型、相同集合元素的EnumSet 集合 。
EnumSet类 EnumSet是一个专门为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。 EnumSet类没有暴露任何构造器来创建该类的实例,EnumSet类提供了以下类方法来创建EnumSet对象。 EnumSet complementOf(EnumSet s):创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet集合,新的集合里包含原集合不包含的枚举值。 EnumSet copyOf(Collection c):使用一个普通集合来创建EnumSet集合; EnumSet copyOf(EnumSet s):复制原集合; EnumSet noneOf(Class EnumSet enumSet = EnumSet.copyOf(c); System.out.println(enumSet);//[Spring, Summer]
EnumSet 说完了 EnumMap 我们再来看看 EnumSet,EnumSet 是一个用来操作 Enum 的集合,是一个抽象类,它有两个继承类,JumboEnumSet 和 RegularEnumSet 通过下面的方式可以创建一个空的 EnumSet,在后续进行使用。 public static void main(String[] args) { EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); enumSet.add(Color.BLUE); enumSet.add(Color.RED); System.out.println(enumSet.size()); } EnumSet <Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet.size()); } 另外前面提到会使用到枚举的
,而应该使用其提供的静态工厂方法,EnumSet的静态工厂方法比较多,如下: //创建一个具有指定元素类型的空EnumSet。 EnumSet<E> noneOf(Class<E> elementType) //创建一个指定元素类型并包含所有枚举值的EnumSet <E extends Enum<E>> EnumSet <Color> enumSet3= EnumSet.complementOf(enumSet2); System.out.println("指定补集:"+enumSet3.toString -----------------"); //复制enumSet5容器的数据作为初始化数据 EnumSet<Color> enumSet6= EnumSet.copyOf enumSet7=EnumSet.copyOf(list); System.out.println("enumSet7:"+enumSet7.toString()); } }
),其中 AbstractSet、EnumSet 属于抽象类,EnumSet 是在 jdk1.5 中新增的,不同的是 EnumSet 集合元素必须是枚举类型。 EnumSet EnumSet 是一个与枚举类型一起使用的专用 Set 集合,继承自AbstractSet抽象类。 EnumSet是一个虚类,不能直接通过实例化来获取对象,只能通过它提供的静态方法来返回EnumSet实现类的实例。 ://创建一个 EnumSet,将EnumEntity 元素内容添加到EnumSet中EnumSet allSet = EnumSet.allOf(EnumEntity.class);System.out.println (allSet); 输出结果:[WOMAN, MAN] 创建一个 EnumSet,添加指定的枚举元素://创建一个 EnumSet,添加 WOMAN 到 EnumSet 中EnumSet customSet
EnumSet 说完了 EnumMap 我们再来看看 EnumSet,EnumSet 是一个用来操作 Enum的集合,是一个抽象类,它有两个继承类,JumboEnumSet和 RegularEnumSet 通过下面的方式可以创建一个空的EnumSet,在后续进行使用。 public static void main(String[] args) { EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); enumSet.add(Color.BLUE); enumSet.add(Color.RED); System.out.println(enumSet.size()); } EnumSet <Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet.size()); } 另外前面提到会使用到枚举的
;
testEnumMap();
//3.演示EnumSet对象的使用
System.out.println("演示EnumSet对象的使用。。。。。") ;
testEnumSet();
}
/**
* 演示EnumSet对象的使用 EnumSet是一个抽象类,获取一个类型的枚举类型内容
* /
private static void testEnumSet() {
EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class [key=RED,value=红灯]
[key=GREEN,value=绿灯]
[key=YELLLOW,value=黄灯]
演示EnumSet对象的使用。。。。。 当前EnumSet中数据为:1
当前EnumSet中数据为:2
当前EnumSet中数据为:3
Disconnected from the target VM, address: '127.0.0.1:
EnumSet是一个专为枚举设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。 同样的我们使用它的原因是:效率高(EnumSet比HashSet更快)。 ((EnumSet) set)); //[RED] // copyOf方法克隆一个(请注意是克隆,并不是返回的一个视图) System.out.println(EnumSet.copyOf 其实这个时候JDK就会用EnumSet的另一个实现JumboEnumSet 实际情况是:试问一下,谁的枚举值能定义64个这么多???拉出去斩了??? (计算机中一个字节(byte)占8位(bit)) 总而言之,EnumSet的实现是非常高级,效率也是非常的高的。
EnumSet 是一个专门针对枚举类型的 Set 接口的实现类,它是处理枚举类型数据的一把利器,非常高效(内部实现是位向量,我也搞不懂)。 因为 EnumSet 是一个抽象类,所以创建 EnumSet 时不能使用 new 关键字。不过,EnumSet 提供了很多有用的静态工厂方法: ? 下面的示例中使用 noneOf() 创建了一个空的 PlayerType 的 EnumSet;使用 allOf() 创建了一个包含所有 PlayerType 的 EnumSet。 <PlayerType> enumSetNone = EnumSet.noneOf(PlayerType.class); System.out.println(enumSetNone); EnumSet<PlayerType> enumSetAll = EnumSet.allOf(PlayerType.class); System.out.println
Java枚举(enum)详解:Java声明枚举类型、枚举(enum)类、EnumMap 与 EnumSet 声明枚举 枚举类 为枚举添加方法 EnumMap 与 EnumSet EnumMap EnumSet 类 EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化,如表 2 所示。 表2 EnumSet 类的常用方法 方法名称 描述 allOf(Class element type) 创建一个包含指定枚举类型中所有枚举成员的 EnumSet 对象 complementOf(EnumSet s) 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,并包含所有 s 中未包含的枚举成员 copyOf(EnumSet s) 创建一个与指定 EnumSet 对象 s 创建包含指定枚举成员的 EnumSet 对象 range(E from ,E to) 创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚举成员 EnumSet 作为 Set