EnumMap比HashMap快在底层用数组按枚举ordinal()直接索引,O(1)访问,无哈希计算、无冲突处理、无装箱开销;实测百万次操作快2–5倍,内存占用低约40%。
EnumMap 比 HashMap 快在哪?
因为
内部用数组而非哈希表存储,索引直接由枚举的
值决定,查键是 O(1) 数组访问,没有哈希计算、没有冲突处理、也没有装箱开销。而
仍需对枚举对象做
和
调用,且枚举实例虽不可变,但仍是对象引用,存在内存和 GC 开销。
必须满足哪些条件才能安全换成 EnumMap?
换的前提很明确:键类型必须是某个具体枚举类,且你**不打算在运行时动态扩展该枚举**(Java 枚举天生不可继承、不可新增实例)。否则会抛
或逻辑错乱。
键类型写死为
,不能是
或通配符
所有可能用作键的枚举常量,必须在定义该
时已存在(编译期确定)
不能把
当作通用 Map 传给期望
的旧代码——它不重写
或
行为,语义不同
初始化和常用操作怎么写?
构造时必须显式传入枚举类字节码,这是强制契约,不是可选参数:
注意:
不接受
键(会立即抛
),但允许
值;它的迭代顺序严格按枚举定义顺序,不是插入顺序,也不是哈希顺序。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
性能差异到底有多大?
在百万级读操作下,
通常比
快 2–5 倍,尤其当枚举值少(如
最容易被忽略的是:一旦用了
,就锁死了键的枚举类型。后续若想支持非枚举键(比如加个字符串配置开关),就得拆成两个 Map 或改用策略模式,灵活性代价得提前想清楚。
EnumMapordinal()HashMaphashCode()equals()IllegalArgumentExceptionMyEnumEnum? extends EnumEnumMapEnumMapHashMaphashCode()toString()EnumMap statusMessages = new EnumMap<>(HttpStatus.class);
statusMessages.put(HttpStatus.OK, "OK");
statusMessages.put(HttpStatus.NOT_FOUND, "Not Found");
// get() 安全,未 put 过的键返回 null(符合 Map 接口约定)
String msg = statusMessages.get(HttpStatus.INTERNAL_SERVER_ERROR); // null
EnumMapnullNullPointerExceptionnullEnumMap.get()HashMap.get()EnumMap