枚举详解之EnumSet、EnumMap用法

枚举简单例子
/** * @author shuliangzhao * @Title: Color * @ProjectName design-parent * @Description: TODO * @date 2019/6/12 22:35 */ public enum Color { YELLOW, RED, BLUE, PURPLE, BLACK; } 
/** * @author shuliangzhao * @Title: ColorEnumTest * @ProjectName design-parent * @Description: TODO * @date 2019/6/12 22:37 */ public class ColorEnumTest { public static void main(String[] args) { Color color = Color.BLUE; switch (color) { case RED: System.out.println("红色"); break; case BLUE: System.out.println("蓝色"); break; case PURPLE: System.out.println("紫色"); break; case BLACK: System.out.println("黑色"); break; case YELLOW: System.out.println("黄色"); break; default: System.out.println("蓝色"); break; } } } 

测试结果java

 

 
image.png

Color枚举的本质就是一个类,编译器会自动为咱们生成Color类,经过反编译获得该类以下:数组

final class Color extends Enum { //编译器为咱们添加的静态的values()方法 public static Color[] values() { return (Color[])$VALUES.clone(); } //编译器为咱们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法 public static Color valueOf(String s) { return (Color)Enum.valueOf(com/sl/emun/Color, s); } //私有构造函数 private Color(String s, int i) { super(s, i); } //前面定义的7种枚举实例 public static final Color YELLOW; public static final Color RED; public static final Color BLUE; public static final Color PURPLE; public static final Color BLACK; private static final Color $VALUES[]; static { //实例化枚举实例 YELLOW = new Color("YELLOW", 0); RED = new Color("RED", 1); BLUE = new Color("BLUE", 2); PURPLE = new Color("PURPLE", 3); BLACK = new Color("BLACK", 4); $VALUES = (new Color[] { YELLOW, RED, BLUE, PURPLE, BLACK }); } } 

能够看出每一个枚举类型颜色是该Color类的一个实例对象,该构成方式和单例模式有些相似,故能够用只有一个枚举类型的枚举做为单例模式,并且枚举的构造器由编译器管理安全性十分高,既能够防止反射破解也能够防止反序列破解。安全

EnumMap用法
/** * @author shuliangzhao * @Title: EnumMapTest * @ProjectName design-parent * @Description: TODO * @date 2019/6/12 22:49 */ public class EnumMapTest { public static void main(String[] args) { EnumMap<Color,String> enumMap = new EnumMap(Color.class); enumMap.put(Color.BLACK,"黑色"); enumMap.put(Color.BLUE,"蓝色"); System.out.println(enumMap); System.out.println(enumMap.get(Color.BLUE)); } } 

运行结果函数

 

 
image.png

EnumMap put方法测试

public V put(K key, V value) { typeCheck(key); int index = key.ordinal(); Object oldValue = vals[index]; vals[index] = maskNull(value); if (oldValue == null) size++; return unmaskNull(oldValue); } 

首先调用typeCheck检查键的类型,若是类型不对,会抛出异常。类型正确的话,调用ordinal获取索引index,并将值value放入值数组vals[index]中。EnumMap容许值为null,为了区别null值与没有值,EnumMap将null值包装成了一个特殊的对象,有两个辅助方法用于null的打包和解包,打包方法为maskNull,解包方法为unmaskNull。spa

get方法code

public V get(Object key) { return (isValidKey(key) ? unmaskNull(vals[((Enum<?>)key).ordinal()]) : null); } 

键有效的话,经过ordinal方法取索引,而后直接在值数组vals里找。isValidKey的代码与typeCheck相似,可是返回boolean值而不是抛出异常。orm

以上就是EnumMap的基本实现原理,内部有两个数组,长度相同,一个表示全部的键,一个表示对应的值,值为null表示没有该键值对,键都有一个对应的索引,根据索引可直接访问和操做其键和值,效率很高。对象

EnumSet

EnumSet这是一个用来操做Enum的集合,是一个抽象类,它有两个继承类:JumboEnumSet和RegularEnumSet。在使用的时候,须要肯定枚举类型。它的特色也是速度很是快,为何速度很快呢?由于每次add的时候,每一个枚举值只占一个长整型的一位。
EnumSet.noneOf()方法建立一个空的set继承

public class EnumSetTest { public static void main(String[] args) { EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); System.out.println(enumSet); enumSet.add(Color.BLUE); enumSet.add(Color.PURPLE); System.out.println(enumSet); } } 

运行结果

 

 
image.png

EnumSet.allOf()方法建立一个满的set

/** * @author shuliangzhao * @Title: EnumSetTest * @ProjectName design-parent * @Description: TODO * @date 2019/6/12 23:24 */ public class EnumSetTest { public static void main(String[] args) { /*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); System.out.println(enumSet); enumSet.add(Color.BLUE); enumSet.add(Color.PURPLE); System.out.println(enumSet);*/ EnumSet<Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet); } } 

运行结果

 

 
image.png

EnumSet.range建立指定范围set

public class EnumSetTest { public static void main(String[] args) { /*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); System.out.println(enumSet); enumSet.add(Color.BLUE); enumSet.add(Color.PURPLE); System.out.println(enumSet); EnumSet<Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet);*/ EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE); System.out.println(enumSet); } } 
 
image.png

EnumSet.complementOf补集建立set

public class EnumSetTest { public static void main(String[] args) { /*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); System.out.println(enumSet); enumSet.add(Color.BLUE); enumSet.add(Color.PURPLE); System.out.println(enumSet); EnumSet<Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet);*/ EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE); System.out.println(enumSet); EnumSet<Color> enumSet1 = EnumSet.complementOf(enumSet); System.out.println(enumSet1); } } 

运行结果

 

 
image.png

EnumSet.copyOf复制建立set

public class EnumSetTest { public static void main(String[] args) { /*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); System.out.println(enumSet); enumSet.add(Color.BLUE); enumSet.add(Color.PURPLE); System.out.println(enumSet); EnumSet<Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet); EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE); System.out.println(enumSet); EnumSet<Color> enumSet1 = EnumSet.complementOf(enumSet); System.out.println(enumSet1);*/ EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE); System.out.println(enumSet); EnumSet<Color> enumSet1 = EnumSet.copyOf(enumSet); System.out.println(enumSet1); } } 

运行结果

 

 
image.png

EnumSet.copyOf复制建立集合

public class EnumSetTest { public static void main(String[] args) { /*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class); System.out.println(enumSet); enumSet.add(Color.BLUE); enumSet.add(Color.PURPLE); System.out.println(enumSet); EnumSet<Color> enumSet = EnumSet.allOf(Color.class); System.out.println(enumSet); EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE); System.out.println(enumSet); EnumSet<Color> enumSet1 = EnumSet.complementOf(enumSet); System.out.println(enumSet1); EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE); System.out.println(enumSet); EnumSet<Color> enumSet1 = EnumSet.copyOf(enumSet); System.out.println(enumSet1);*/ List<Color> colors = new ArrayList<>(); colors.add(Color.PURPLE); colors.add(Color.BLUE); colors.add(Color.BLUE); System.out.println(colors); EnumSet<Color> enumSet = EnumSet.copyOf(colors); System.out.println(enumSet); } } 

运行结果

 

 
image.png

注意:经过结果能够看出ArrayList内放置的元素能够重复,而EnumSet内放置的元素不重复。

相关文章
相关标签/搜索