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); } } }
相关推荐
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...
`通过key删除,`enumMap.erase(enumMap.begin(), enumMap.end());`清空整个map。 7. **swap操作** map的`swap()`函数并不交换容器内的元素,而是交换两个map容器的所有内容,即交换它们的内部结构和元素。例如: ...
简单查询算法,供学习参考。 代码中描述了Enum和EnumMap类的使用。
示例#[macro_use]外部包装箱enum_map; 使用enum_map :: EnumMap; #[derive(Debug,EnumMap)]枚举示例{A,B,C,} fn main(){让mut map = enum_map! {示例:: A => 1,示例:: B => 2,示例:: C => 3,};...
clear() 就相当于 `enumMap.erase(enumMap.begin(), enumMap.end());` Map 的其他操作 Map 还提供了许多其他的操作,例如反转 Map、合并两个 Map、将 Map 转换为其他容器等。这些操作可以根据实际情况选择使用。 ...
此外,由于`EnumMap`内部使用了数组实现,它的性能接近于直接使用`ordinal()`,同时保持了Map的所有优点,如键的类型安全和丰富的API。 `EnumMap`的构造函数接收一个枚举类型的`Class`对象,这是一种类型的标记,...
【EnumMap和EnumSet详解】 在Java编程中,当我们需要处理特定枚举类型(Enum)作为键(Key)的映射关系时,EnumMap和EnumSet成为两种非常实用的工具类。它们是Java集合框架中专门为枚举类型设计的高效容器,提供了...
EnumMap是Java中的一种特殊映射实现,它要求键必须来自枚举类型,并且对于每个可能的键值,都有预定义的条目。
枚举类中的每个枚举成员都有一个默认的整型值,称为`ordinal`,表示其在枚举中的位置,从0开始。由于`Enum`类实现了`Comparable`接口,所以可以直接对枚举进行排序。 Java还提供了专门针对枚举的集合类:`EnumMap`...
Java 中的 Java.util.EnumMap.putAll(map) 方法用于将所有映射从一个映射复制到另一个较新的映射。较旧的映射将替换为较新的映射。
11. **枚举映射**:`EnumMap`是一种高效且类型安全的映射,专为枚举类型设计。 12. **序列化**:`SerializationUtils`提供了对象序列化和反序列化的功能。 13. **代码优化**:3.12.0版本可能还包含了性能优化和...
System.out.println("当前 ordinal " + aLight.ordinal()); System.out.println("当前值 " + aLight); } } ``` #### 四、枚举类型高级用法 除了基本的定义和使用之外,Java 还提供了专门用于枚举类型的容器类,...
EnumSet<Color> colors = EnumSet.allOf(Color.class); ``` `EnumMap`则是另一种专门为枚举设计的数据结构,它是`Map`接口的一个实现。与普通`HashMap`相比,`EnumMap`在性能和内存使用上都有优势,因为它的键总是...
- `EnumSet`和`EnumMap`是专门为枚举设计的高效集合类,它们提供了针对枚举类型优化的操作。 枚举在Java中的应用广泛,尤其是在设计模式中,如工厂模式、策略模式等。使用枚举可以增强代码的可读性和可维护性,...
enumMap.erase(enumMap.begin(), enumMap.end()); // 清空 map ``` #### 五、Map 的基本操作函数 1. **begin()**:返回指向 map 开始位置的迭代器。 2. **clear()**:删除所有元素。 3. **count()**:返回指定键...
枚举在集合框架中也有广泛应用,如`java.util.EnumSet`和`java.util.EnumMap`,它们提供了针对枚举类型优化的高效集合实现。 总的来说,Java枚举提供了一种强类型、安全且易于使用的机制来表示固定集合的值。通过...
3. **不可变集合**:Google Collections 提供了构建不可变集合的便利方法,如 ImmutableList.of(), ImmutableSet.of() 和 ImmutableMap.of(),确保集合一旦创建就不能被修改,增强了代码的安全性。 4. **函数式编程...
5. **新的集合工厂方法**:如List.of()和Map.of(),方便创建不可变集合。 6. **改进的类型推断**:编译器可以更好地推断泛型实例化时的类型,使代码更简洁。 7. ** Nashorn JavaScript引擎**:作为标准库的一部分,...
5. **枚举常量的自然顺序**:枚举常量按照声明的顺序进行排序,可以用`ordinal()`方法获取其在枚举中的位置。 在实际编程中,枚举可以用于实现模式匹配、单例模式等多种设计模式。例如,可以定义一个状态枚举来表示...