首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HashMap性能很好?问过我EnumMap没

1 简介

我们知道只是一个接口,它有多种实现,Java中最常用的是了。而本文想讲述的是另一个实现:。它是枚举类型的,要求它的Key值都必须是枚举型的。

2 创建你的EnumMap

既然是关于枚举类型的Map,我们先创建一个枚举,以便后续使用:

2.1 创建EnumMap的三种方法

JDK提供的创建的方法有三种,代码如下:

(1) 使用方法时,与不同,它必须传入一个枚举的类型才能创建对象;

(2) 从复制,这时传入的参数为;

(3) 从复制,传入的参数为,但要求Key的类型必须是枚举型。

2.2 聪明的Guava

其实可以综合上面三种情况,实际就是两种方法:

(1) 使用

(2) 使用

聪明的就只提供了这两种方法,如下:

3 基本操作

提供的方法与Map当然是一样的,操作十分方便,代码如下:

需要特别指出的是删除方法,可以传入Key和Value两个参数,当键值对匹配时,则可以删除成功;匹配失败,则不会删除。

4 集合视图

4.1 有序性

与Map接口提供的功能一样,也能返回它的所有Values、Keys和Entry等。但与不同的是,返回的视图是有序的,这个顺序不是插入的顺序,而是枚举定义的顺序。代码如下:

输出的结果如下:

这个顺序与我们定义枚举的顺序确实是一样的,而与添加的顺序无关。

4.2 联动性

除了有序性之外,返回的集合视图还有一点不同就是联动性,即牵一发而动全身。改变其中一个,另外的也跟着变了。看代码一下就明白了:

5 性能

性能是我们选择的主要原因之一,那为何它性能会比优秀的还要好呢?通过看源码可以得知:

(1)底层是通过两个数组来存放数据的,一个放Keys,一个放Values;

(2)因为Key值是枚举类型,即一开始就确定了元素个数,所以在创建一个的时候,存放数据的数组就已经确定了大小,不用考虑后续扩容带来的性能问题。

(3)枚举本身就是固定顺序的,可以通过方法获得顺序,这个便可以作为查询与插入的索引,而不用计算,性能也会比较快。这个顺序也就是数组下标。这也是的集合视图都是有序的原因。

(4)因为大小固定,则不用考虑加载因子,也不会有哈希冲突的问题,空间复杂度小。

6 结论

本文介绍了作为一个的特殊实现的创建、使用、集合视图和性能分析,发现它的确是有过人之处的。当我们的Key值是枚举时,不妨可以试一试,性能会更好哦。

欢迎关注公众号,将持续为你更新...

多读书,多分享;多写作,多整理。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191107A0PR0E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券