/** * @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
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類的一個實例對象,該構成方式和單例模式有些相似,故能夠用只有一個枚舉類型的枚舉做爲單例模式,並且枚舉的構造器由編譯器管理安全性十分高,既能夠防止反射破解也能夠防止反序列破解。安全
/** * @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)); } }
運行結果函數
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這是一個用來操做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); } }
運行結果
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); } }
運行結果
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); } }
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); } }
運行結果
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); } }
運行結果
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); } }
運行結果