Map的实现类有很多种,EnumMap从名字我们可以看出这个Map是给枚举类用的。它的key为枚举元素,value自定义。在工作中我们也可以用其他的Map来实现我们关于枚举的需求,但是为什么要用这个EnumMap呢?
因为它的性能高!为什么性能高?
因为它的内部是用数组的数据结构来维护的!我们可以看一下它的源码实现:

Put方法

public V put(K key, V value) {  typeCheck(key);  int index = key.ordinal();  Object oldValue = vals[index];  vals[index] = maskNull(value);  if (oldValue == null)  size++;  return unmaskNull(oldValue);
}  

typeCheck是用来检查key的类型的,因为key只能为枚举元素。接下来的这一句int index = key.ordinal();key.ordinal()这个就是我们上面说的枚举类型的序号,然后被当做数组的下标,放到vals这个数组里。那么get方法呢?

get方法

public V get(Object key) {  return (isValidKey(key) ?  unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
}  

注意这一句话:vals[((Enum< ? >)key).ordinal()]。这个不就是取得下标,根据下标获取数组中的值吗?!

remove方法


public V remove(Object key) {  if (!isValidKey(key))  return null;  int index = ((Enum<?>)key).ordinal();  Object oldValue = vals[index];  vals[index] = null;  if (oldValue != null)  size--;  return unmaskNull(oldValue);
}  

remove方法的实现也是挺简单的,就是把相应下标的元素变为null,等着GC回收。

下面是使用EnumMap的一个例子:

EnumMap<EnumTest01, String> enumMap = new EnumMap<EnumTest01, String>(EnumTest01.class);
enumMap.put(EnumTest01.DELETE, "dsdsd");
enumMap.put(EnumTest01.UPDATE, "qqqqqq");
for (Map.Entry<EnumTest01, String> entry : enumMap.entrySet()) {  System.out.println(entry.getValue() + entry.getKey().getEnumDesc());
}  

Effective Java之EnumMap代替序数索引(三十三)相关推荐

  1. Effective Java~37. 用EnumMap 代替序数索引

    有时可能会看到使用 ordinal 方法(条目 35)来索引到数组或列表的代码. 例如,考虑一下这个简单的类来代表一种植物: class Plant {enum LifeCycle { ANNUAL, ...

  2. 用EnumMap代替序数索引

    用EnumMap代替序数索引   有时候,会见到利用ordinal方法来索引数组的代码.例如下面这个简化的类,表示一种烹饪用的香草: public class Herb {public enum Ty ...

  3. Effective Java 枚举和注解 第33条:用 EnumMap 代替序数索引

    有时候,你可能会见到利用 ordinal 方法(见第31条)来索引数组的代码.例如下面这个过于简化的类,用来表示一种烹饪用的香草: public class Hurb {public enum Typ ...

  4. Effective Java之注解优于命名模式(三十五)

    Java 1.5之前,一般使用命名模式表明有些程序元素需要通过某种工具或者框架进行特殊处理.例如,JUnit测试框架原本要求用户一定要用test作为测试方法名称的开头. 命名模式的缺点: 文字拼写错误 ...

  5. Effective Java之必要时进行保护性拷贝(三十九)

    我们来看一个不可变对象的攻守问题: public class Period{private final Date startTime;private finale Date endTime;publi ...

  6. Effective Java之检查参数的有效性(三十八)

    检查参数的有效性实际上是满足了这一条普遍原则: 应该在发生错误之后尽快检测出错误. 例子: 有个数据库查询的例子,传入一个id,查出一个Student对象,然而返回null,如果没有及时检查这个实例是 ...

  7. Effective Java之坚持使用Overide注解(三十六)

    @Override 注解: 表示被注解的方法声明覆盖了超类型中的一个声明 1.我们应该在想要覆盖超类声明的每个方法声明中使用 Override 注解 ; 如果使用了Override注解的方法是重载而不 ...

  8. Effective Java之用EnumSet代替位域(三十二)

    什么是位域?为什么用到它? 先来看一个例子: public class Test {public static final byte STYLE_BOLD = 1<<0; // 1publ ...

  9. 5天带你读完《Effective Java》(三)

    <Effective Java>是Java开发领域无可争议的经典之作,连Java之父James Gosling都说: "如果说我需要一本Java编程的书,那就是它了". ...

最新文章

  1. python库--tensorflow--RNN(循环神经网络相关)
  2. vb6 datagrid表格垂直居中_Word文档中表格的定位方式
  3. Kafka,它为什么速度会这么快?
  4. Linux学习笔记——gzip命令
  5. 二叉树最近公共祖先 LCA
  6. js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法
  7. 牛顿法的优缺点及特征
  8. Layui富文本编辑器提交表单时获取内容为空
  9. 自定义ArcView-构造拓展性高的view
  10. Autodesk AutoCAD 2022 产品系列已发布(附下载)
  11. Visual Studio 2010 使用Windows Media Player控件实现播放音乐视频
  12. java kindeditor ssh,typecho KindEditor插件
  13. matlab红点沿着正弦曲线运动,如何使用css3让一个元素做正弦曲线运动?
  14. Wince6.0nbsp;s3c6410触摸屏驱动分析
  15. 一个程序员如何给LPL发弹幕加油
  16. Lesson 43 Smart 组件 vs Dumb 组件
  17. R语言入门第一集 R语言、RTools、RStudio的简介、安装与使用
  18. python写qq群机器人怎么弄_python打造自由DIY 群聊机器人
  19. sudo -i和sudo -s
  20. 就业报到证的常见问题解答汇总

热门文章

  1. list Control实现单元格编辑与插入Combo Box
  2. WebRTC 的音频处理流水线
  3. JDK 14 调试神器了解一下?
  4. 阿里技术官最新总结一份105道Java面试题小册,看完我惊呆了
  5. 在线提问:音视频技术开发是事业还是热爱所在?
  6. 2021 音视频技术趋势不完全预测
  7. 韩嫕:坚持coding
  8. VIPKID 张武锋:自研RTC的故事
  9. BBR如何让Spotify流媒体更流畅?
  10. GC之G1垃圾收集器