美文网首页Java程序那些事
一文弄懂EnumMap和EnumSet

一文弄懂EnumMap和EnumSet

作者: flydean程序那些事 | 来源:发表于2020-05-06 06:40 被阅读0次

一文弄懂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

欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com

相关文章

  • 一文弄懂EnumMap和EnumSet

    一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数...

  • EnumSet,EnumMap

    EnumSet 枚举单参数能参与switch case值判断: 测试结果: 每个枚举类型颜色是该Color类的一个...

  • 基础知识梳理&Enum

    Enum EnumMap EnumSet 1.noneOf创建空队列 2.allOf创建满队列 3.range创建...

  • Android中不推荐使用Enum

    一、Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum...

  • 第六章枚举和注解

    目录 使用枚举类型替代整型常量 使用实例属性替代序数 使用EnumSet替代位属性 使用EnumMap替代序数索引...

  • Enum

    java定义新的类型的方式:类、接口、枚举 取出枚举的全部类容: 类集对枚举的支持:EnumMap、EnumSet...

  • Enum、EnumMap、EnumSet的用法讲解

    在工作中遇到这样一个问题,要在前台页面上渲染出来所有的枚举元素,但是前台页面用的是Velocity,所以需要把枚举...

  • 枚举详解之EnumSet、EnumMap用法

    枚举简单例子 测试结果 Color枚举的本质就是一个类,编译器会自动为我们生成Color类,通过反编译得到该类如下...

  • java EnumSet学习

    一、EnumSet 简单介绍 二、EnumSet的内部设计思路 EnumSet是一个抽象类,内部多处采用静态工厂方...

  • 第 90 条:考虑用序列化代理代替序列化实例

    EnumSet

网友评论

    本文标题:一文弄懂EnumMap和EnumSet

    本文链接:https://www.haomeiwen.com/subject/wcjvghtx.html