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

tech2024-01-13  70

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

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

最新回复(0)