关于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