一文弄懂EnumMap和EnumSet

简介: 一文弄懂EnumMap和EnumSet

目录



一文弄懂EnumMap和EnumSet


简介


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


EnumMap


先看一下EnumMap的定义和HashMap定义的比较:


public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>
    implements java.io.Serializable, Cloneable


public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable


我们可以看到EnumMap几乎和HashMap是一样的,区别在于EnumMap的key是一个Enum。


下面看一个简单的使用的例子:


先定义一个Enum:


public enum Types {
    RED, GREEN, BLACK, YELLO
}


再看下怎么使用EnumMap:


@Test
    public void useEnumMap(){
        EnumMap<Types, String> activityMap = new EnumMap<>(Types.class);
        activityMap.put(Types.BLACK,"black");
        activityMap.put(Types.GREEN,"green");
        activityMap.put(Types.RED,"red");
    }


其他的操作其实和hashMap是类似的,我们这里就不多讲了。


什么时候使用EnumMap


因为在EnumMap中,所有的key的可能值在创建的时候已经知道了,所以使用EnumMap和hashMap相比,可以提升效率。


同时,因为key比较简单,所以EnumMap在实现中,也不需要像HashMap那样考虑一些复杂的情况。


EnumSet


跟EnumMap很类似,EnumSet是一个set,然后set中的元素都是某个Enum类型。


EnumSet是一个interface而不是一个类,要创建EnumSet类可以使用EnumSet提供的两个静态方法,noneOf和allOf。


先看一个noneOf:


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);
    }


noneOf传入一个Enum类,返回一个空的Enum类型的EnumSet。


从上面的代码我们可以看到EnumSet有两个实现,长度大于64的时候使用JumboEnumSet,小有64的时候使用RegularEnumSet。


注意,JumboEnumSet和RegularEnumSet不建议直接使用,他是内部使用的类。


再看一下allOf:


public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
        EnumSet<E> result = noneOf(elementType);
        result.addAll();
        return result;
    }


allOf很简单,先调用noneOf创建空的set,然后调用addAll方法将所有的元素添加进去。


总结


EnumMap和EnumSet对特定的Enum对象做了优化,可以在合适的情况下使用。


本文的例子https://github.com/ddean2009/learn-java-collections

相关文章
|
7月前
|
设计模式
LinkedHashSet源码详解
LinkedHashSet源码详解
|
7月前
|
存储 安全 Java
Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
49 0
|
存储 算法 Java
【Java集合类】之Map集合的特点及使用
【Java集合类】之Map集合的特点及使用
155 0
|
存储 算法 Java
老哥你真的知道ArrayList#sublist的正确用法么
我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?
169 0
老哥你真的知道ArrayList#sublist的正确用法么
|
安全 Java 编译器
【小家Java】深入理解Java枚举类型(enum)及7种常见的用法(含EnumMap和EnumSet)(上)
【小家Java】深入理解Java枚举类型(enum)及7种常见的用法(含EnumMap和EnumSet)(上)
【小家Java】深入理解Java枚举类型(enum)及7种常见的用法(含EnumMap和EnumSet)(上)
【小家Java】深入理解Java枚举类型(enum)及7种常见的用法(含EnumMap和EnumSet)(中)
【小家Java】深入理解Java枚举类型(enum)及7种常见的用法(含EnumMap和EnumSet)(中)
|
存储 Java 程序员
Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同
《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。 这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳。
|
Java 编译器
Java并发系列(6)java关键字-final
本站小福利 点我获取阿里云优惠券 原文作者:github:CL0610/Java-concurrency免责声明: 1.本文所转载文章均来自公开网络。2.如果出处标注有误或侵犯到原著作者权益,请联系删除。
1001 0
EnumSet源码解析
EnumSet源码解析
628 0
|
存储 Java 容器
Java容器深入浅出之HashSet、TreeSet和EnumSet
Java集合中的Set接口,定义的是一类无顺序的、不可重复的对象集合。如果尝试添加相同的元素,add()方法会返回false,同时添加失败。Set接口包括3个主要的实现类:HashSet、TreeSet和EnumSet。
1310 0