`
leonzhx
  • 浏览: 796817 次
  • 性别: 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...

    MAP的讲解利用

    `通过key删除,`enumMap.erase(enumMap.begin(), enumMap.end());`清空整个map。 7. **swap操作** map的`swap()`函数并不交换容器内的元素,而是交换两个map容器的所有内容,即交换它们的内部结构和元素。例如: ...

    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,};...

    C++_map的基本操作和使用

    clear() 就相当于 `enumMap.erase(enumMap.begin(), enumMap.end());` Map 的其他操作 Map 还提供了许多其他的操作,例如反转 Map、合并两个 Map、将 Map 转换为其他容器等。这些操作可以根据实际情况选择使用。 ...

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

    此外,由于`EnumMap`内部使用了数组实现,它的性能接近于直接使用`ordinal()`,同时保持了Map的所有优点,如键的类型安全和丰富的API。 `EnumMap`的构造函数接收一个枚举类型的`Class`对象,这是一种类型的标记,...

    一文弄懂EnumMap和EnumSet

    【EnumMap和EnumSet详解】 在Java编程中,当我们需要处理特定枚举类型(Enum)作为键(Key)的映射关系时,EnumMap和EnumSet成为两种非常实用的工具类。它们是Java集合框架中专门为枚举类型设计的高效容器,提供了...

    java集合-EnumMap的使用

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

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

    枚举类中的每个枚举成员都有一个默认的整型值,称为`ordinal`,表示其在枚举中的位置,从0开始。由于`Enum`类实现了`Comparable`接口,所以可以直接对枚举进行排序。 Java还提供了专门针对枚举的集合类:`EnumMap`...

    Java 中的 EnumMap putAll(map) 方法

    Java 中的 Java.util.EnumMap.putAll(map) 方法用于将所有映射从一个映射复制到另一个较新的映射。较旧的映射将替换为较新的映射。

    commons-lang3-3.12.0-bin.zip

    11. **枚举映射**:`EnumMap`是一种高效且类型安全的映射,专为枚举类型设计。 12. **序列化**:`SerializationUtils`提供了对象序列化和反序列化的功能。 13. **代码优化**:3.12.0版本可能还包含了性能优化和...

    java枚举类型enum的使用

    System.out.println("当前 ordinal " + aLight.ordinal()); System.out.println("当前值 " + aLight); } } ``` #### 四、枚举类型高级用法 除了基本的定义和使用之外,Java 还提供了专门用于枚举类型的容器类,...

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

    EnumSet&lt;Color&gt; colors = EnumSet.allOf(Color.class); ``` `EnumMap`则是另一种专门为枚举设计的数据结构,它是`Map`接口的一个实现。与普通`HashMap`相比,`EnumMap`在性能和内存使用上都有优势,因为它的键总是...

    Java 常用武器库之枚举1

    - `EnumSet`和`EnumMap`是专门为枚举设计的高效集合类,它们提供了针对枚举类型优化的操作。 枚举在Java中的应用广泛,尤其是在设计模式中,如工厂模式、策略模式等。使用枚举可以增强代码的可读性和可维护性,...

    map总结,原理,使用

    enumMap.erase(enumMap.begin(), enumMap.end()); // 清空 map ``` #### 五、Map 的基本操作函数 1. **begin()**:返回指向 map 开始位置的迭代器。 2. **clear()**:删除所有元素。 3. **count()**:返回指定键...

    java枚举的一个实例

    枚举在集合框架中也有广泛应用,如`java.util.EnumSet`和`java.util.EnumMap`,它们提供了针对枚举类型优化的高效集合实现。 总的来说,Java枚举提供了一种强类型、安全且易于使用的机制来表示固定集合的值。通过...

    google-collections.zip

    3. **不可变集合**:Google Collections 提供了构建不可变集合的便利方法,如 ImmutableList.of(), ImmutableSet.of() 和 ImmutableMap.of(),确保集合一旦创建就不能被修改,增强了代码的安全性。 4. **函数式编程...

    jdk1.6到1.8版本全.zip

    5. **新的集合工厂方法**:如List.of()和Map.of(),方便创建不可变集合。 6. **改进的类型推断**:编译器可以更好地推断泛型实例化时的类型,使代码更简洁。 7. ** Nashorn JavaScript引擎**:作为标准库的一部分,...

    JAVA高级编程中Enum枚举

    5. **枚举常量的自然顺序**:枚举常量按照声明的顺序进行排序,可以用`ordinal()`方法获取其在枚举中的位置。 在实际编程中,枚举可以用于实现模式匹配、单例模式等多种设计模式。例如,可以定义一个状态枚举来表示...

Global site tag (gtag.js) - Google Analytics