0
点赞
收藏
分享

微信扫一扫

Java基础知识回顾8-枚举

一、基本概念

枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但是枚举类不能继承其他类。

二、解决ifelse

随着业务的发展,需求只会越来越复杂,为了考虑各种各样的情况,代码中不可避免的会出现很多的if-else。一旦代码中的if-else过多,就会大大影响其可读性和可维护性。

我们可以使用枚举类解决这个问题;

package day03;

/**
 * @author qx
 * @date 2023/10/20
 * @des 季节枚举
 */
public enum SeasonEnum {
    SPRING, SUMMER, AUTUMN, WINTER
}

package day03;

/**
 * @author qx
 * @date 2023/10/20
 * @des 枚举测试
 */
public class EnumTest {
    public static void main(String[] args) {
        testSwitch(SeasonEnum.AUTUMN);
    }

    private static void testSwitch(SeasonEnum season) {
        switch (season) {
            case SPRING:
                System.out.println("春天");
                break;
            case SUMMER:
                System.out.println("夏天");
                break;
            case AUTUMN:
                System.out.println("秋天");
                break;
            case WINTER:
                System.out.println("冬天");
                break;
        }
    }
}

三、枚举常用方法

方法名

说明

values()

返回枚举实例的数组,该数组中的元素保持在枚举中声明的顺序

name()

返回实例名

ordinal()

返回实例声明时的次序

getDeclaringClass()

返回实例所属的枚举类型

equals()

判断枚举实例是否为同一个对象

compareTo()

比较两个对象的ordinal值

四、EnumMap

EnumMap作为枚举的专属集合,由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值,毕竟数组是一段连续的内存空间,根据程序局部性原理,效率会很高。

EnumMap需要传递一个类型信息,即Class对象,通过这个参赛EnumMap就可以根据类型信息初始化内部数据结构。

package day03;

/**
 * @author qx
 * @date 2023/10/20
 * @des 季节枚举
 */
public enum SeasonEnum {
    SPRING(0, "春天"), SUMMER(1, "夏天"), AUTUMN(2, "秋天"), WINTER(3, "冬天");

    private int code;
    private String msg;

    SeasonEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public int getCode() {
        return code;
    }
}

package day03;

/**
 * @author qx
 * @date 2023/10/26
 * @des
 */
public class StudyJava {

    private String name;

    private SeasonEnum seasonEnum;

    public StudyJava(String name, SeasonEnum seasonEnum) {
        this.name = name;
        this.seasonEnum = seasonEnum;
    }

    public StudyJava() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public SeasonEnum getSeasonEnum() {
        return seasonEnum;
    }

    public void setSeasonEnum(SeasonEnum seasonEnum) {
        this.seasonEnum = seasonEnum;
    }
}

package day03;

import java.util.*;

/**
 * @author qx
 * @date 2023/10/26
 * @des HashMap和EnumMap
 */
public class EnumMapDemo {
    public static void main(String[] args) {
        List<StudyJava> list = new ArrayList<>();
        list.add(new StudyJava("春天", SeasonEnum.SPRING));
        list.add(new StudyJava("春天1", SeasonEnum.SPRING));
        list.add(new StudyJava("夏天", SeasonEnum.SUMMER));
        list.add(new StudyJava("秋天", SeasonEnum.AUTUMN));
        list.add(new StudyJava("秋天1", SeasonEnum.AUTUMN));
        list.add(new StudyJava("冬天", SeasonEnum.WINTER));
        Map<SeasonEnum, Integer> map = new HashMap<>();
        for (StudyJava studyJava : list) {
            SeasonEnum seasonEnum = studyJava.getSeasonEnum();
            Integer count = map.get(seasonEnum);
            if (count != null) {
                map.put(seasonEnum, count + 1);
            } else {
                map.put(seasonEnum, 1);
            }
        }
        System.out.println(map);
        System.out.println("--------------");

        // 使用EnumMap
        Map<SeasonEnum, Integer> enumMap = new EnumMap<>(SeasonEnum.class);
        for (StudyJava studyJava : list) {
            SeasonEnum seasonEnum = studyJava.getSeasonEnum();
            Integer count = enumMap.get(seasonEnum);
            if (count != null) {
                enumMap.put(seasonEnum, count + 1);
            } else {
                enumMap.put(seasonEnum, 1);
            }
        }
        System.out.println(enumMap);

    }
}

输出:

{AUTUMN=2, SUMMER=1, SPRING=2, WINTER=1}
--------------
{SPRING=2, SUMMER=1, AUTUMN=2, WINTER=1}


举报

相关推荐

0 条评论