1.枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型
2.它既是一种类(class)却又比普通类多了些特殊的约束,这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性
3.枚举类的出现就是为了解决定义常量的繁琐
4.没有枚举类型时定义常量常见的方式:
public class DayDemo {
public static final int MONDAY =1;
public static final int TUESDAY=2;
public static final int WEDNESDAY=3;
public static final int THURSDAY=4;
public static final int FRIDAY=5;
public static final int SATURDAY=6;
public static final int SUNDAY=7;
}
(1)上述的常量定义常量的方式称为int枚举模式
(2)类型安全和使用方便性上并没有多少好处
5.利用枚举类型来重新定义上述的常量:
public class EnumDemo {
public static void main(String[] args){
//直接引用
Day day =Day.MONDAY;
}
}
//定义枚举类型
enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
(1)定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型
(2)枚举类型可以像类(class)类型一样,定义为一个单独的文件,也可以定义在其他类内部
(3)枚举类型Day中分别定义了从周一到周日的值,值一般是大写的字母,多个值之间以逗号分隔
6.枚举实现原理:
(1)使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类
(2)这个类继承了Java API中的java.lang.Enum类
(3)枚举类的高阶用法:
public enum Color {
MONDAY("1","星期一"),THUSDAY("2","星期二");//这个后面必须有分号
private String code;
private String name;
//省略get/set方法
private Color(String code,String name) {//创建私有的构造方法
this.code = code;
this.name = name;
}
}
public static void main(String[] args) {
System.out.println(Color.MONDAY.getCode());//1
System.out.println(Color.MONDAY.getName());//星期一
System.out.println(Color.THUSDAY.getCode());//2
System.out.println(Color.THUSDAY.getName());//星期二
}
7.EnumMap基本用法:
(1)场景应用: 有一堆size大小相同而颜色不同的数据,需要统计出每种颜色的数量是多少以便将数据录入仓库
//定义如下枚举用于表示颜色Color:
enum Color {
GREEN,RED,BLUE,YELLOW
}
(2)使用HashMap与EnumMap对比
public class EnumMapDemo {
public static void main(String[] args){
List<Clothes> list = new ArrayList<>();
list.add(new Clothes("C001",Color.BLUE));
list.add(new Clothes("C002",Color.YELLOW));
list.add(new Clothes("C003",Color.RED));
list.add(new Clothes("C004",Color.GREEN));
list.add(new Clothes("C005",Color.BLUE));
list.add(new Clothes("C006",Color.BLUE));
list.add(new Clothes("C007",Color.RED));
list.add(new Clothes("C008",Color.YELLOW));
list.add(new Clothes("C009",Color.YELLOW));
list.add(new Clothes("C010",Color.GREEN));
//方案1:使用HashMap
Map<String,Integer> map = new HashMap<>();
for (Clothes clothes:list){
String colorName=clothes.getColor().name();
Integer count = map.get(colorName);
if(count!=null){
map.put(colorName,count+1);
}else {
map.put(colorName,1);
}
}
System.out.println(map.toString());
//方案2:使用EnumMap
Map<Color,Integer> enumMap=new EnumMap<>(Color.class);
for (Clothes clothes:list){
Color color=clothes.getColor();
Integer count = enumMap.get(color);
if(count!=null){
enumMap.put(color,count+1);
}else {
enumMap.put(color,1);
}
}
System.out.println(enumMap.toString());
}
/**
输出结果:
{RED=2, BLUE=3, YELLOW=3, GREEN=2}
---------------
{GREEN=2, RED=2, BLUE=3, YELLOW=3}
*/
}
<1>EnumMap作为枚举的专属的集合
<2>EnumMap要求其Key必须为Enum类型
<3>使用EnumMap会更加高效,它只能接收同一枚举类型的实例作为键值且不能为null