当前位置: 首页 > Web前端 > HTML5

你知道Java中的EnumMap吗?

时间:2023-04-05 23:05:02 HTML5

提到Java中的集合Map,大家可能会经常使用HashMap/ConcurrentHashMap,但是当Map的key是枚举类型时,有没有想过使用EnumMap呢?那么当key为枚举类型时,EnumMap和HashMap有什么区别呢?HashMap:使用Hash表存储,底层是一个数组,数组中存放的是入口对象,默认长度为16。也就是说,每次向Map中添加一个对象,先计算hash根据键值取值,然后根据数组的长度放到合适的位置。当发生冲突时,使用“开链法”,即在冲突位置添加链表;Java8在解决冲突的时候,增加了红黑树的解决方案。总的来说,HashMap是一种以空间换取时间,提高访问效率的方式。但是如果我们知道了key的所有值,是不是每次都需要计算hash值,然后找到位置,解决冲突,甚至扩容……EnumMap:既然所有的key都知道了,应用已知数组的大小,每次访问根据枚举变量的序号定位到数组的指定位置,直接访问,这样效率高,不会浪费中间的存储空间。下面进入EnumMap的内部探索。在这里,小编建了一个前端学习交流按钮群:132667127,自己整理的最新前端资料和进阶开发教程。有需要的可以进群学习交流主要成员:publicclassEnumMap,V>extendsAbstractMapimplementsjava.io.Serializable,Cloneable{//键值的枚举类型privatefinalClasskeyType;//根据key值的枚举类型会预先缓存所有的枚举变量privatetransientK[]keyUniverse;/***所有的vlaue值,数组下标为枚举变量的序号(序号)*数组内容为map中枚举变量对应的vlaue*/privatetransientObject[]vals;//当前地图的大小,privatetransientintsize=0;}详细用法:假设这样一个Enum对象是预先确定的publicenumWeekEnum{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;}构造method://构造函数使用示例EnumMapweekEnumMap=newEnumMap<>(WeekEnum.class);//会预先获取所有的枚举值,然后根据枚举值的个数,创建一个存储值的相应大小的数组publicEnumMap(ClasskeyType){this.keyType=keyType;keyUniverse=getKeyUniverse(keyType);vals=newObject[keyUniverse.length];}putmethod://检查枚举值类型,然后根据key的序号将值存入对应下标数组publicVput(Kkey,Vvalue){typeCheck(key);intindex=key.ordinal();对象oldValue=vals[index];vals[索引]=maskNull(值);如果(oldValue==null)大小++;返回unmaskNull(旧值);}getmethod://还是先校验key值类型,然后根据key的序号去数组的位置取值publicVget(Objectkey){return(isValidKey(key)?unmaskNull(vals[((Enum)key).ordinal()]):null);}