`
cakin24
  • 浏览: 1332498 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

专为枚举类设计的集合类EnumSet

    博客分类:
  • java
阅读更多

一 集合类EnumSet概述

  • EnumSet是一个专为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类的定义顺序来决定集合元素的顺序。
  • EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很好。尤其是当进行批量操作(如调用containsAll 和 retainAll方法)时,如果其参数也是EnumSet集合,则该批量操作的执行速度也非常快。
  • EnumSet集合不允许加入null元素。如果试图插入null元素,EnumSet将抛出 NullPointerException异常。如果仅仅只是试图测试是否出现null元素、或删除null元素都不会抛出异常,只是删除操作将返回false,因为没有任何null元素被删除。

EnumSet类的常规应用

1 代码示例

import java.util.*;

enum Season
{
	SPRING,SUMMER,FALL,WINTER
}
public class EnumSetTest
{
	public static void main(String[] args)
	{
		// 创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
		EnumSet es1 = EnumSet.allOf(Season.class);
		System.out.println(es1); // 输出[SPRING,SUMMER,FALL,WINTER]
		// 创建一个EnumSet空集合,指定其集合元素是Season类的枚举值。
		EnumSet es2 = EnumSet.noneOf(Season.class);
		System.out.println(es2); // 输出[]
		// 手动添加两个元素
		es2.add(Season.WINTER);
		es2.add(Season.SPRING);
		System.out.println(es2); // 输出[SPRING,WINTER]
		// 以指定枚举值创建EnumSet集合
		EnumSet es3 = EnumSet.of(Season.SUMMER , Season.WINTER);
		System.out.println(es3); // 输出[SUMMER,WINTER]
		EnumSet es4 = EnumSet.range(Season.SUMMER , Season.WINTER);
		System.out.println(es4); // 输出[SUMMER,FALL,WINTER]
		// 新创建的EnumSet集合的元素和es4集合的元素有相同类型,
		// es5的集合元素 + es4集合元素 = Season枚举类的全部枚举值
		EnumSet es5 = EnumSet.complementOf(es4);
		System.out.println(es5); // 输出[SPRING]
	}
}

2 运行结果

[SPRING, SUMMER, FALL, WINTER]
[]
[SPRING, WINTER]
[SUMMER, WINTER]
[SUMMER, FALL, WINTER]
[SPRING]

3 代码说明

此代码示范了如何使用EnumSet来保存枚举类的多个枚举值。

 

三 EnumSet类的错误使用

1 代码示例

import java.util.*;
enum Season
{
	SPRING,SUMMER,FALL,WINTER
}
public class EnumSetTest2
{
	public static void main(String[] args)
	{
		Collection c = new HashSet();
		c.clear();
		c.add(Season.FALL);
		c.add(Season.SPRING);
		// 复制Collection集合中所有元素来创建EnumSet集合
		EnumSet enumSet = EnumSet.copyOf(c);   // ①
		System.out.println(enumSet); // 输出[SPRING,FALL]
		c.add("Java");
		c.add("Linux");
		// 下面代码出现异常:因为c集合里的元素不是全部都为枚举值
		enumSet = EnumSet.copyOf(c);  // ②
		System.out.println(enumSet);
	}
}

 

2 运行结果

[SPRING, FALL]
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum
        at java.util.EnumSet.copyOf(Unknown Source)
        at EnumSetTest2.main(EnumSetTest2.java:21)

 

3 代码说明

当试图复制一个Collection集合里的元素来创建EnumSet集合时,必须保证Collection集合里的所有元素都是同一个枚举类的枚举值。

 

 

0
0
分享到:
评论

相关推荐

    java集合-EnumSet的使用

    它是 AbstractSet 的子类,并专门为枚举类型设计,提供了高效的实现。 下面是关于 EnumSet 的一些重要信息: 存储枚举元素:EnumSet 只能存储同一个枚举类型的元素,不能存储不同枚举类型的元素。它基于位向量实现...

    java实现高效的枚举元素集合示例

    Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能...EnumSet是专门为enum实现的集合类,本实例将演示其用法

    Java实现高效的枚举元素集合

     思路分析:可以通过为EnumSet指定类型,该类型即为在同一包中定义的枚举类。使用EnumSet类的add()方法添加元素,使用EnumSet类的remove()方法删除元素,使用EnumSet类的complementOf()方法获取对象的全部,使用...

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    NULL 博文链接:https://mlaaalm.iteye.com/blog/694720

    Java期末复习——枚举与反射机制

    Java——枚举: enum关键字、Enum类 类集对枚举的支持——EnumMap类与EnumSet类 枚举类实现接口、在枚举类中定义抽象方法 Java反射机制: Class类、Class类的使用 反射的应用:取得类的结构

    阅读EnumSet抽象类

    主要介绍了阅读EnumSet抽象类源码,具有一定参考价值,需要的朋友可以了解下。

    用枚举值管理项目字典的实战应用(适配器模式)(代码示例)

    用枚举值管理项目字典的实战应用(适配器模式)(代码示例) 枚举值相比常量的优势 应用场景 模拟代码实现 ...常量需要用到反射,而枚举的EnumSet提供了直接遍历的方法。 1.4 离散值面向对象,方便程序调用。

    Java EnumSet工作原理初窥

     首先以事实说话,存在这样一个EnumSet,它有50个枚举值T0~T49,将50个值插入到容器(HashSet、EnumSet)中,为一个操作,将50个枚举值移出做为第二个操作。把第一个和第二个操作执行的总时间设定为一个周期,拿...

    enumset-用于创建紧凑的枚举集的库-Rust开发

    enumset一个用于定义可在紧凑位集中使用的枚举的库。 它支持最多128个变量的枚举,并具有在枚举中使用这些集合的宏。用于定义可在紧凑位集中使用的枚举的库。 它支持最多128个变量的枚举,并具有一个宏以在常量中...

    Java中EnumSet代替位域代码详解

    主要介绍了Java中EnumSet代替位域代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    高级编程-java实验报告.docx

    实验目的及要求 1) 掌握Java集合框架的概念以及几种具体实现:ArrayList, LinkedList, HashSet, TreeSet, PriorityQueue; 2) 掌握Java集合框架的映射的概念以及映射的...3)枚举类型的使用,EnumSet和EnumMap的使用;

    Options:有时在某些情况下,您想在OptionSet中使用Enum或希望Enum由Raw的Int类型支持,但同时也具有String标签

    目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将EnumSet转换为Enum数组使用...

    Java枚举(深刻而不深沉平淡而不平庸)

    1.枚举概述 2.枚举的常用方法 ...枚举实现接口和类 5.Switch状态机,组织枚举,策略枚举 6.EnumSet和EnumMap 原创文章 56获赞 82访问量 5515 关注 私信 展开阅读全文 作者:陌路逢君 唯图一笑

    疯狂JAVA讲义

    6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 对象与垃圾回收 225 6.9.1 对象在内存中的状态 226 6.9.2 强制垃圾回收 227 6.9.3 finalize方法 228 ...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    Set集合介绍 Set集合的概念   Set集合类似于一个容器,程序把...集合元素值可以为null; 不保证元素的排列顺序,有可能排列顺序与添加顺序不同; 非同步集合,多线程访问HashSet时,是不安全的,需要通过同步代码保证

    Java开发技术大全 电子版

    11.2.9枚举集(EnumSet)使用示例358 11.3常用算法361 11.3.1Collections中的简单算法361 11.3.2排序362 11.3.3二分查找364 11.4遗留的类和接口366 11.4.1Enumeration接口简介366 11.4.2向量类(Vector)使用...

    一文弄懂EnumMap和EnumSet

    一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的情况则可以考虑使用本文要讲的EnumMap。 EnumMap 先看...

    nexuslib-as3:一个Actionscript库,提供强大的反射,序列化,种子随机数生成,加密,联网等功能

    nexuslib是Actionscript库的集合。 枚举,随机,反射,序列化,加密,音频系统,HTTP请求。 反射库专门用于生产环境,目前正在生产环境中使用。 入门 下载,或在您的项目中克隆仓库和参考。 外部依赖 没有任何 ...

    集合效率不完全皮恩车

    以循环1000000万次为标准! 定义如下数组 public static char[] chars = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'} ; 比较对象 List接口 AttributeList , ArrayList , ...

    yuchuangu85#Develop-Source#01. 考虑使用静态工厂方法替代构造方法1

    声明的返回类型的任何子类都是允许的。返回对象的类也可以随每次发布而不同。EnumSet 类(详见第 36 条)没有公共构造方法,只有静态工厂。在 OpenJDK

Global site tag (gtag.js) - Google Analytics