HashMap 源码学习 (jdk1.8)


ps:HashMap 相关的源码分析,网上有写很多了,这里就不献丑了。本文主要写我个人觉得注意的一些点。

1. key的匹配

map匹配key,是 == 或者 equals相等。这里就有个要注意的地方,如果key是用的一个对象,两个对象的equals方法相等,则在map的key就是相等的。

2. transient 修饰数组

第一个原因,数组多数情况下是不满的,序列化未使用的部分会浪费空间,这个大家都知道。

第二个原因谈到的比较少:同一个键值对在不同 JVM 下,所处的桶位置可能是不同的,在不同的 JVM 下反序列化 table 可能会发生错误。
HashMap 的get/put/remove等方法第一步就是根据 hash 找到键所在的桶位置,但如果键没有覆写 hashCode 方法,计算 hash 时最终调用 Object 中的 hashCode 方法。Object 中的 hashCode 方法是 native 型的,不同的 JVM 下,可能会有不同的实现,产生的 hash 可能也是不一样的。也就是说同一个键在不同平台下可能会产生不同的 hash,此时再对在同一个 table 继续操作,就会出现问题。

3. putAll

putAll 本质上还是复用put方法一个个添加元素的,并不会在一开始就申请好足够的容量,所以是有可能出现多次resize的。

4. entrySet、keySet 等集合

与 ArrayList的subList类似,本质也是映射到HashMap的,并没有单独申请内存并存储数据,所以对他们进行修改时,也会影响到原来的HashMap。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值