首页 > 编程语言 >Java--枚举类型

Java--枚举类型

时间:2024-08-28 09:08:19浏览次数:9  
标签:Java -- System EnumSet 枚举 println operate out

目录

定义

枚举是一个特殊的类,一般表示一组常量,比如一年的4个季节,一年的12月份,方向的东南西北等

声明

使用enum关键字来定义,各个常量使用逗号,来分割例如:

enum Color{
    RED,GREEN,BLUE
}
public class Test
{
    // 执行输出结果
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

枚举类

枚举类也可以在内部声明

枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。

枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它

for语句中迭代枚举元素

enum Color 
{ 
    RED, GREEN, BLUE; 
} 
public class MyClass { 
  public static void main(String[] args) { 
    for (Color myVar : Color.values()) {
      System.out.println(myVar);
    }
  } 
}

switch语句中使用枚举类

enum Color{
    RED,GREEN,BLUE
}
public class MyClass{
    public static void main(String[]args){
        Color myVar = Color.BLUE;
        switch(myVar){
            case RED:
                System.out.println("红色");
                break;
            case GREEN:
                System.out.println("绿色");
                break;
            case BLUE:
                System.out.println("蓝色");
                break;
        }
    }
}

values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。

EnumMap

Map接口的实现,其key-value映射中的key是Enum类型;

其原理就是一个对象数组,数组的下标索引就是根据Map中的key直接获取,即枚举中的ordinal值;

效率比HashMap高,可以直接获取数组下标索引并访问到元素;

package com.exercise;

import java.util.EnumMap;
import java.util.Map;
import java.util.Map.Entry;

enum Operate{
    ADD, UPDATE, DELETE;
}

public class Main {

    public static void main(String[] args) {
        Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);


        //put方法
        map.put(Operate.ADD, "add operate");
        map.put(Operate.UPDATE, "update operate");
        map.put(Operate.DELETE, "delete operate");

        //重写了toString方法
        System.out.println(map);

        //size方法
        System.out.println(map.size());

        System.out.println(map.containsKey(Operate.UPDATE));
        System.out.println(map.containsValue("update operate"));
        System.out.println(map.get(Operate.DELETE));

        //remove
        map.remove(Operate.UPDATE);
        System.out.println(map);

        //key集合
        for(Operate operate:map.keySet()){
            System.out.print(operate + " ");
        }

        System.out.println();
        //value集合
        for(String obj:map.values()){
            System.out.print(obj + ",");
        }

        System.out.println();
        //key-value集合
        for(Entry<Operate, String> entry:map.entrySet()){
            System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
        }

    }
}

运行结果

{ADD=add operate, UPDATE=update operate, DELETE=delete operate}
3
true
true
delete operate
{ADD=add operate, DELETE=delete operate}
ADD DELETE 
add operate,delete operate,
ADD: add operate, DELETE: delete operate, 

EnumSet

通过结果可以看出ArrayList内放置的元素可以重复,而EnumSet内放置的元素不重复

是一个用来操作Enum的集合,是一个抽象类,它有两个继承类:JumboEnumSet和RegularEnumSet。在使用的时候,需要确定枚举类型。它的特点也是速度非常快,为什么速度很快呢?因为每次add的时候,每个枚举值只占一个长整型的一位。

enum Season {
    SPRING, SUMMER, FALL, WINTER
}

public class EnumSetTest {
    public static void main(String[] args) {
        //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值    //EnumSet.allOf()创建一个满的set
        EnumSet es1 = EnumSet.allOf(Season.class);
        //输出[SPRING, SUMMER, FALL, WINTER]
        System.out.println(es1);
        //创建一个EnumSet空集合,指定其集合元素是Season类的枚举值
        EnumSet es2 = EnumSet.noneOf(Season.class);
        //输出[]
        System.out.println(es2);
        //手动添加两个元素
        es2.add(Season.WINTER);
        es2.add(Season.SPRING);
        //输出[Spring, WINTER]
        System.out.println(es2);
        //以指定枚举值创建EnumSet集合
        EnumSet es3 = EnumSet.of(Season.SUMMER, Season.WINTER);
        //输出[SUMMER, WINTER]
        System.out.println(es3);     
        //创建一个包含两个枚举值范围内所有枚举值的EnumSet集合(创建指定范围set使用EnumSet.range方法)
        EnumSet es4 = EnumSet.range(Season.SUMMER, Season.WINTER);
        //输出[SUMMER, FALL, WINTER]s
        System.out.println(es4);
        //新创建的EnumSet集合元素和es4集合元素有相同的类型
        //es5集合元素 + es4集合元素=Season枚举类的全部枚举值
        EnumSet es5 = EnumSet.complementOf(es4);//补集EnumSet.complementOf创建set
        System.out.println(es5);
        //创建一个集合
        Collection c = new HashSet();
        c.clear();
        c.add(Season.SPRING);
        c.add(Season.WINTER);
        //复制Collection集合中的所有元素来创建EnumSet集合
        EnumSet es = EnumSet.copyOf(c);
        //输出es
        System.out.println(es);
        c.add("111");
        c.add("222");
        //下面代码出现异常,因为c集合里的元素不是全部都为枚举值
        es = EnumSet.copyOf(c);
    }
}

使用场景

1.作为普通的常量使用,如星期、季节、颜色、城市等等;通常配合switch语句使用

2.往枚举中添加变量、构造函数、以达到灵活获取指定值的目的(注: Java 要求必须先定义 enum 实例,否则编译会报错);通常用于一些业务系统中定义一些固定值,如用于匹配db中的字段值等,发现最近代码中的一些常量可以使用这种方法来替换

3.往枚举中添加自己特定方法,以实现自己所需的相关业务逻辑

4.其它用法,java中的枚举还有许多其它的用法,如重写toString()、equals()等方法,实现接口、枚举Map等等

标签:Java,--,System,EnumSet,枚举,println,operate,out
From: https://www.cnblogs.com/yangcurry/p/18383914

相关文章

  • Doc-Image-Tool 文档图像处理工具
    Doc-Image-Tool文档图像处理工具免费,开源,用于文档图像的处理软件完整项目:https://github.com/jiangnanboy/Doc-Image-Tool免费:本项目所有代码开源,完全免费。方便:解压即用,离线运行,无需网络。功能:漂白/文字方向矫正/清晰增强/笔记去噪美化/去阴影/扭曲矫正/切......
  • Java学习笔记9-数据类型的转化
    一.显示转化在Java中,数据类型的转换主要分为两种:自动类型转换(也称为隐式类型转换)和强制类型转换(也称为显式类型转换)。1.自动类型转换(隐式类型转换)自动类型转换是指在赋值或运算过程中,较小的数据类型自动转换为较大的数据类型。Java编译器会自动进行这种转换,不需要程序员显式指......
  • 元气日语 Genki-1 第 4 课 初次约会
    初めてのデート课文Iメアリー:すみません。マクドナルドはどこですか。知らない人:あそこにホテルがありますね。マクドナルドはあのホテルの前ですよ。メアリー:ありがとうございます。IIメアリー:ただいま。お父さん:おかえりなさい。映画はどうでし......
  • Java--泛型
    目录什么是泛型泛型的作用泛型的特性泛型的使用泛型类泛型接口泛型方法泛型通配符什么是泛型泛型是JavaSE5中引入的一个新特性,它提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。简单来说,泛型是一种参数化类型,它可以将类型(类、接口、枚举等)作为参数传......
  • Java学习笔记10-运算符
    Java运算符是用于执行各种数学、逻辑和位运算的符号。Java中的运算符可以分为以下几类:一、算术运算符用于执行基本的数学运算,如加、减、乘、除和取模。常用的算术运算符包括+、-、*、/和%。算数运算符详解Java中的算术运算符包括加、减、乘、除、取模等,下面分别详细介绍。1.1......
  • 【数据结构】【模板】李超线段树
    李超线段树定义可以看看洛谷的模板题目:作用优化动态规划,如果可以将一个动态规划的转移式子转化为\(y=kx+b\)的形式,那么我们可以边转移边将\(y=kx+b\)这条线段放入李超线段树,然后在下次转移时,直接调用下次计算出来的\(x\)位置上的最大值或最小值。(结合题目理解......
  • 如何有效学习Android Framework:从系统编译到Framework深入
    Android开发者中,不少人希望从应用开发过渡到系统层次的开发,特别是深入理解和掌握Framework的开发技能,这不仅能为你打开新的职业大门,还能让你更深入地理解Android系统的运行机制。本文将介绍如何从系统编译开始,逐步深入到系统应用和Framework的学习路径。1.掌握系统编译:打好基础......
  • 调整 MongoDB 以适应批量加载
    将几十亿条记录加载到MongoDB中,开始时加载速度还不错,但一段时间后就开始明显放缓。通过观察指标进行了一些研究,发现随着时间的推移,WiredTiger的检查点时间越来越长。检查点时间从最初的几秒到后面的几分钟。在检查点期间,性能基本上是直线下降: WiredTiger检查点从MongoDB......
  • MySQL索引底层实现原理
    索引的本质MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最......
  • SDKD 2024 Summer Training Contest E2补题
    SDKD2024SummerTrainingContestE2A-PaperWatering题意对x进行至多k次操作(平方或开方后向下取整),求可以得到多少不同的数。思路平方完一定不同,且平方完后一定能开方出整数,所以只用额外考虑开方后平方的情况。若开方再平方与原来不同,则答案加上当前变化数的次数,直到变......