专业的JAVA编程教程与资源

网站首页 > java教程 正文

JAVA脱水学习-Java枚举类型、枚举集合介绍

temp10 2024-10-06 02:04:04 java教程 11 ℃ 0 评论

枚举类型

从前面的数据类型章节可知 Java 中并没有枚举类型,但通过 Java API 中的 java.lang.Enum 枚举类我们可以定义枚举类型数据,本质上还是一个类类型。字符窜类型也是一样,通过 String 类生成,每一个双引号中的字符串编译后都会创建对应的字符串 String 对象。 为什么要定义枚举类型?有时后变量只会取几个确定值中的一个,这时枚举类型就很方便了,如定义一周的星期几:

public class Test {
 // 定义一周日期
 enum Day {
 SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
 }
}

1.枚举类型的定义

通过关键字 enum 定义枚举类型数据,数据值一般采用大写。定义位置可以放在类中,类的外部,或者另外的文件中定义。

JAVA脱水学习-Java枚举类型、枚举集合介绍

package test;

// 枚举数据
enum TestEnum
{
 VALUE1, VALUE2
}

public class em
{
 // 定义一周日期
 enum Day
 {
 SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
 }

 public static void main(String[] args)
 {
 System.out.println(Day.MONDAY); // 输出: Monday
 System.out.println(TestEnum.VALUE1); // 输出: VALUE1
 }
}

2.switch 操作

enum 支持 switch 操作。

package test;

public class em
{
 enum Color
 {
 RED, YELLOW, GREEN
 }

 public static void main(String[] args)
 {
 Color cor = Color.RED;
 switch (cor) {
 case RED:
 // do something
 break;
 case YELLOW:
 // do something
 break;
 case GREEN:
 // do something
 break;
 }
 }
}

3.自定义枚举类

可以通过定制 Enum 类型来定义自己的枚举类。需要注意的是枚举类型的构造函数是私有的 private,所以不能通过 New 来创建枚举类型,正因如此才保证了枚举数据类型的安全,不会被更改。如:

定义一个 Color enum 类型

package test;

public enum Color
{
 RED("红色", 1), YELLOW("黄色", 2), GREEN("绿色", 3);

 private String name;
 private int index;

 Color(String name, int index)
 {
 this.name = name;
 this.index = index;
 }

 public String getName()
 {
 return name;
 }

 public int getIndex()
 {
 return index;
 }
}

使用Color 枚举类型

package test;

public class em
{
 public static void main(String[] args)
 {
 // 获取枚举类型
 Color cor = Color.GREEN;

 // if 比较
 if (cor.getIndex() == 3) {
 System.out.println("当前是:" + cor.getName());
 }

 cor = Color.RED;

 // switch 比较
 switch (cor) {
 case RED:
 System.out.println("当前是:" + cor.getName());
 break;
 case YELLOW:
 System.out.println("当前是:" + cor.getName());
 break;
 case GREEN:
 System.out.println("当前是:" + cor.getName());
 break;
 default:
 System.out.println("未获取到颜色类型");
 break;
 }
 }
}

// 打印结果:
当前是:绿色
当前是:红色

4.相关枚举类

处理 enum 枚举类型,还有集合相关的枚举类型数据,如:EnumMap、EnumSet。

4.1 EnumMap 枚举型映射/字典

相当于 key 是枚举类型的映射。如:

EnumMap<Color, String> a = new EnumMap<>(Color.class);
a.put(Color.RED, "red");
a.put(Color.GREEN, "green");
System.out.println(a.get(Color.RED)); // 输出:red
System.out.println(a.get(Color.GREEN)); // 输出:green
System.out.println(a.toString()); // 输出:{RED=red, GREEN=green}

4.2 EnumSet 枚举集合

EnumSet 是个抽象类,不能实例化,查看源码发现有提供静态实例化 JumboEnumSet 或 RegularEnumSet 对象的方法。这两个对象继承自 EnumSet,区别在于 EnumSet 大小,大于 64 时创建的是 JumboEnumSet 对象,小于 64 时创建的是 RegularEnumSet 对象。源码如下:

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
 implements Cloneable, java.io.Serializable
{
 /**
 * Creates an empty enum set with the specified element type.
 *
 * @param <E> The class of the elements in the set
 * @param elementType the class object of the element type for this enum
 * set
 * @return An empty enum set of the specified type.
 * @throws NullPointerException if <tt>elementType</tt> is null
 */
 public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
 Enum<?>[] universe = getUniverse(elementType);
 if (universe == null)
 throw new ClassCastException(elementType + " not an enum");

 if (universe.length <= 64)
 return new RegularEnumSet<>(elementType, universe);
 else
 return new JumboEnumSet<>(elementType, universe);
 }
}

使用枚举集合:

package test;

import java.util.EnumSet;

public class em
{
 public static void main(String[] args)
 {
 EnumSet<Color> cor = EnumSet.noneOf(Color.class);
 cor.add(Color.RED);
 cor.add(Color.YELLOW);
 cor.add(Color.GREEN);
 System.out.println(cor.toString());
 for (Color c : cor) {
 System.out.println("Index:" + c.getIndex() + " Name:" + c.getName());
 }
 cor.clear();
 System.out.println(cor.toString());

 }
}

// 打印结果
[RED, YELLOW, GREEN]
Index:1 Name:红色
Index:2 Name:黄色
Index:3 Name:绿色
[]

更多方法查看源码了解。EnumSet 是非线程安全的,要想线程安全使用 Collections.synchronizedSet() 处理EnumSet 对象,如:

Set<Color> s = Collections.synchronizedSet(EnumSet.noneOf(Color.class));

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表