@rxq
枚举
1、枚举是java中异种特殊的集合,可以保存一系列的数据选项,枚举类是可以直接用 '枚举类名.枚举选项' 使用的
2、所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类
3、枚举的构造方法是用private修饰的,是私有构造方法,防止被外部调用
4、父类Enum中的定义的方法只有toString方法没有使用final修饰
5、枚举的应用场景
* 可以保存一周的星期
* 可以保存颜色的数据
* 保存性别
* 。。。。
6、枚举的定义格式:
public enum 枚举类名{
枚举1,枚举2,枚举3 ....;
}
例如:
public enum Gender{ //性别选项
MAN,WOMAN; //这里的枚举选项名称都为“常量”
}
测试
// 创建枚举类
public enum Week{
/**
* 定义一周的星期的枚举
*/
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRTDAY,SATURDAY,SUNDAY;
}
//测试类
//定义一个对象变量week,为其赋值
Week week = Week.MONDAY;
//使用选择语句进行测试
switch(week){
case MONDAY:
System.out.println("周一啦");break;
case TUESDAY:
System.out.println("周二啦");break;
case WEDNESDAY:
System.out.println("周三啦");break;
case THURSDAY:
System.out.println("周四啦");break;
case FRTDAY:
System.out.println("周五啦");break;
case SATURDAY:
System.out.println("周六啦");break;
case SUNDAY:
System.out.println("周日啦");break;
default:
System.out.println("不是一个正确的星期");break;
}
//测试结果
保存枚举的方式
使用集合保存枚举选项,可以使用HashMap、EnumMap、EnumSet
* HashMap就与平时使用方式一样
* EnumMap与HashMap不同,
* 它需要传递一个类型信息,即Class对象,通过这个参数EnumMap就可以根据类型信息初始化其内部数据结构Map<Week,Integer> enumMap=new EnumMap<>(Week.class);
* EnumMap内部有两个数组,长度相同,一个表示所有可能的键(枚举值),一个表示对应的值,不允许keynull,但允许value为null,键都有一个对应的索引,根据索引直接访问和操作其键数组和值数组
*
* EnumSet 中所有元素都必须是枚举类型
* 与其他Set接口的实现类HashSet/TreeSet(内部都是用对应的HashMap/TreeMap实现的)不同的是,EnumSet在内部实现是位向量
* 位向量是一种极为高效的位运算操作,由于直接存储和操作都是bit,因此EnumSet空间和时间性能都十分可观
* EnumSet不允许使用 null 元素,EnumSet不是线程安全的
* 创建EnumSet并不能使用new关键字,因为它是个抽象类,而应该使用其提供的静态工厂方法
测试
// 使用list集合保存
List<Weeks> list = new ArrayList<>();
list.add(new Weeks("C001",Week.MONDAY));
list.add(new Weeks("C002",Week.TUESDAY));
list.add(new Weeks("C003",Week.WEDNESDAY));
list.add(new Weeks("C004",Week.THURSDAY));
list.add(new Weeks("C005",Week.FRTDAY));
list.add(new Weeks("C006",Week.SATURDAY));
list.add(new Weeks("C007",Week.SUNDAY));
list.add(new Weeks("C008",Week.SATURDAY));
list.add(new Weeks("C009",Week.TUESDAY));
list.add(new Weeks("C0010",Week.THURSDAY));
list.add(new Weeks("C0011",Week.SUNDAY));
//使用hashMap保存枚举
Map<String,Integer> map = new HashMap<>();
for (Weeks weeks:list){
String weekName=weeks.getWeek().name();
Integer count = map.get(weekName);
if(count!=null){
map.put(weekName,count+1);
}else {
map.put(weekName,1);
}
}
System.out.println(map.toString());
// 使用enumMap保存枚举
Map<Week,Integer> enumMap=new EnumMap<>(Week.class);
for (Weeks clothes:list){
Week week2=clothes.getWeek();
Integer count = enumMap.get(week2);
if(count!=null){
enumMap.put(week2,count+1);
}else {
enumMap.put(week2,1);
}
}
System.out.println(enumMap.toString());
//测试结果