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

关于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),因此效率低很多。大神果然还是大神

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值