关于map的getOrDefault方法为什么要这么写的思考

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 关于map的getOrDefault方法为什么要这么写的思考,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

关于map的getOrDefault方法为什么要这么写

对于map的getOrDefault,可以看到是这么写的:

default V getOrDefault(Object key, V defaultValue) {
  V v;
  return (((v = get(key)) != null) || containsKey(key))
    ? v
    : defaultValue;
}

看了注释的内容,它要实现的目的是,不存在key的时候返回默认值,存在key但得到的value是null的时候返回实际值,其余情况返回实际值(简单总结就是包含key就返回实际值,否则返回默认值)。

那我的问题是为什么要写得这么复杂呢? 下面我的写法也实现了同样的功能,还很好理解

default V getOrDefault(Object key, V defaultValue) {
  return containsKey(key) ? get(key) : defaultValue;
}

经过一阵思考**,我觉得其实是个概率和效率的问题。

首先作者认为传入某个key,这个key存在于map的概率非常大。(应该也是调查过的)

结论

那对于作者的写法,就会大概率的情况下只需要调用一次get(key)就行了,无需执行containsKey(key),大大提高了效率;但是对于我的写法,大概率需要执行containsKey(key) 和 get(key),因此效率低很多。大神果然还是大神

其实这种 概率效率 的思维,其实也在轻量级锁的实现机制上有所体现,轻量级锁的实现机制认为,线程竞争资源,大概率是只有它自己在竞争,因此无需加锁(仅仅是有个门牌的东西),假如真遇上多个线程要竞争了,轻量级锁升级为重量级锁。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135252.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!