枚举类型

一、概述

关键字enum可以将一组具名的值IDE有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。所有的枚举类型都会继承java.lnag.Enum点击查看Enum常用方法。所有的枚举类型都不能被继承。

二、一个简单的示例

public enum Color {
	 RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
	
    private String name;
    private int index;
    
    Color(String name, int index) {
        this.name = name;
        this.index = index;
    }
    
    /**
     * values() 获取一个枚举数组
     * 通过索引获取值
     */
    public static String getName(int index) {
    	for(Color color : Color.values()) {
    		if (color.index == index) {
				return color.name;
			}
    	}
    	return null;
    }
	
    /**
     * ordinal() 获取枚举放入的顺序
     * 通过名字获取放入的顺序
     */
    public static int getOrdinal(String name) {
    	for(Color color : Color.values()) {
    		if (color.name == name) {
				return color.ordinal();
			}
    	}
    	return -1;
    }

	public String getName() {
		return name;
	}

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

	public int getIndex() {
		return index;
	}

}

public class EnumDemo {
	public static void main(String[] args) {
		Color c = Color.GREEN;
		System.out.println("名称:" + c.getName() + ";编号: " + c.getIndex());
		System.out.println(c.name());
		System.out.println(Color.getOrdinal(c.getName()));
	}
}

三、EnumSet

Set与枚举类型一起使用的专用实现。枚举集中的所有元素必须来自单个枚举类型,该类型在创建集时显式或隐式指定。枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的“位标志” 的高质量,类型安全的替代品。如果它们的参数也是枚举集,即使批量操作(例如containsAll和retainAll)也应该非常快速地运行。
迭代器方法返回的迭代器以其自然顺序(枚举常量声明的顺序)遍历元素。返回的迭代器是弱一致的:它永远不会抛出ConcurrentModificationException ,它可能会也可能不会显示迭代进行过程中对集合所做的任何修改的影响。
不允许使用空元素。尝试插入null元素将抛出NullPointerException。但是,尝试测试null元素的存在或删除一个元素将正常工作。
与大多数集合实现一样,EnumSet不同步。如果多个线程同时访问枚举集,并且至少有一个线程修改了该集,则应该在外部进行同步。这通常通过在自然封装枚举集的某个对象上进行同步来实现。如果不存在此类对象,则应使用该Collections.synchronizedSet(java.util.Set) 方法“包装”该集合。这最好在创建时完成,以防止意外的不同步访问:
设置<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
实施说明:所有基本操作都在恒定时间内执行。它们很可能(虽然不能保证)比HashSet同行快得多 。如果它们的参数也是枚举集,即使批量操作也会在恒定时间内执行。
此类是 Java Collections Framework的成员 。

	public static void main(String[] args) {
		EnumSet<Color> eColors = EnumSet.allOf(Color.class);
		for(Color color : eColors) {
			System.out.println("name: " + color.getName() + "\tindex: " + color.getIndex());
		}
	}

四、EnumMap

Map与枚举类型键一起使用的专用实现。枚举映射中的所有键必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表现非常紧凑和高效。
枚举映射按其键的自然顺序(枚举常量的声明顺序)维护。这反映在由集合视图返回的迭代(keySet(), entrySet(),和values())。
集合视图返回的迭代器非常一致:它们永远不会抛出ConcurrentModificationException,它们可能会也可能不会显示迭代进行过程中对映射所做的任何修改的影响。
不允许使用空密钥。尝试插入空键将抛出NullPointerException。但是,尝试测试是否存在空键或删除空键将正常运行。允许空值。
与大多数集合实现一样,EnumMap不同步。如果多个线程同时访问枚举映射,并且至少有一个线程修改了映射,则应该在外部进行同步。这通常通过在自然封装枚举映射的某个对象上同步来完成。如果不存在此类对象,则应使用该Collections.synchronizedMap(java.util.Map<K, V>) 方法“包装”地图。这最好在创建时完成,以防止意外的不同步访问:
Map <EnumKey,V> m = Collections.synchronizedMap(new EnumMap <EnumKey,V>(...));
实施说明:所有基本操作都在恒定时间内执行。它们很可能(虽然不能保证)比HashMap执行更快 。
此类是 Java Collections Framework的成员 。

	public static void main(String[] args) {
        EnumMap<Color, String> weekMap = new EnumMap<Color, String>(Color.class);
        weekMap.put(Color.BLANK, "白色");
        weekMap.put(Color.GREEN, "绿色");
        // ... ...
        for (Iterator<Entry<Color, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry<Color, String> entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }		
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值