`
leonzhx
  • 浏览: 770297 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Item 33: Use EnumMap instead of ordinal indexing

阅读更多

1.  There is a very fast Map implementation designed for use with enum keys, known as java.util.EnumMap. EnumMap is comparable in speed to an ordinal-indexed array because it uses such an array internally. The EnumMap constructor takes the Class object of the key type: this is a bounded type token, which provides runtime generic type information.

 

2.  You may see an array of arrays indexed by ordinals used to represent a mapping from two enum values:

// Using ordinal() to index array of arrays - DON'T DO THIS!
public enum Phase { SOLID, LIQUID, GAS;
    public enum Transition {
        MELT, FREEZE, BOIL, CONDENSE, SUBLIME, DEPOSIT;
        // Rows indexed by src-ordinal, cols by dst-ordinal
        private static final Transition[][] TRANSITIONS = {
            { null, MELT, SUBLIME },
            { FREEZE, null, BOIL },
            { DEPOSIT, CONDENSE, null }
        };
        // Returns the phase transition from one phase to another
        public static Transition from(Phase src, Phase dst) {
            return TRANSITIONS[src.ordinal()][dst.ordinal()];
        }
    }
}

Again, you can do much better with EnumMap:

// Using a nested EnumMap to associate data with enum pairs
public enum Phase {
    SOLID, LIQUID, GAS;
    public enum Transition {
        MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID),
        BOIL(LIQUID, GAS), CONDENSE(GAS, LIQUID),
        SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);
        final Phase src;
        final Phase dst;
        Transition(Phase src, Phase dst) {
            this.src = src;
            this.dst = dst;
        } 
// Initialize the phase transition map
        private static final Map<Phase, Map<Phase,Transition>> m = new EnumMap<Phase, Map<Phase,Transition>>(Phase.class);
        static {
            for (Phase p : Phase.values())
                m.put(p,new EnumMap<Phase,Transition>(Phase.class));
            for (Transition trans : Transition.values())
                m.get(trans.src).put(trans.dst, trans);
        }
        public static Transition from(Phase src, Phase dst) {
            return m.get(src).get(dst);
        }
    }
}

 

 

分享到:
评论

相关推荐

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 37: Use EnumMap instead of ordinal indexing Item 38: Emulate extensible enums with interfaces Item 39: Prefer annotations to naming patterns Item 40: Consistently use the Override annotation Item...

    java Enum EnumMap 简单例子

    简单查询算法,供学习参考。 代码中描述了Enum和EnumMap类的使用。

    使用数组存储值的枚举的优化映射实现。-Rust开发

    示例#[macro_use]外部包装箱enum_map; 使用enum_map :: EnumMap; #[derive(Debug,EnumMap)]枚举示例{A,B,C,} fn main(){让mut map = enum_map! {示例:: A =&gt; 1,示例:: B =&gt; 2,示例:: C =&gt; 3,};...

    一文弄懂EnumMap和EnumSet

    文章目录简介EnumMap什么时候使用EnumMapEnumSet总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的...

    java集合-EnumMap的使用

    EnumMap是Java中的一种特殊映射实现,它要求键必须来自枚举类型,并且对于每个可能的键值,都有预定义的条目。

    Java中EnumMap代替序数索引代码详解

    主要介绍了Java中EnumMap代替序数索引代码详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

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

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

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

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

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

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

    Java中常用Map测试示例

    Java中常用Map测试示例 包含 Map HashMap EnumMap等等

    疯狂JAVA讲义

    7.6.5 EnumMap实现类 281 7.7 HashSet和HashMap的性能选项 282 7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换操作 287 7.8.3 同步控制 288 7.8.4 设置不可变集合 288 7.9 烦琐...

    Thinking in Java 4th Edition

    of abstraction ........................ 15 An object has an interface ........................... 17 An object provides services ................... 18 The hidden implementation .................... ...

    廖雪峰 Java 教程.doc

    使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream Filter模式 操作Zip 读取...

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

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

Global site tag (gtag.js) - Google Analytics