HashMap源码学习

1. 产品定位

HashMap顾名思义,是拿来存放键值对的(key-value pair),就好像花名册一样,班主任上课点同学的名字(相当于key),就可以找到这个同学是谁(相当于value)。

2. 适用场景

HashMap允许NULL当作value,也允许NULL当作key。

HashMap并非线程安全,如果要多线程使用,需要使用者自己额外加锁,保证线程安全性。如果是多线程使用的话,不推荐使用HashMap,而应该使用ConcurrentHashMap(已保证线程安全)。

3. 竞品对比

HashTable & TreeMap

4. 思路分析

5. 具体实现

  • 创建bucket大小


    将bucket的数量设置为2的N次方

用户传入指定的容量大小,JDK则自动计算刚好大于等于这个容量的2的幂次方数。举个例子,如果用户设置容量大小为5,则JDK会将bucket容量大小设置为8。

还是举上面的这个例子来解释算法的实现思路,5的二进制为101,8的二进制为1000。我们再来想一下6(110)和7(111)和8之间的关系,都是他们的最高位(第三位)为1,所以只需要把第三位之后的所有位都设置为1,则十进制数字5/6/7都会变成二进制数字111,这个数字加一即为8。至于为什么一开始要先将cap-1,最后再+1,是因为8这个数字。推荐大家自己去跑一下代码就懂了,光看是有点懵逼的。

其实不用这个算法,也可以自己通过比较2的幂次方大小来比较,写一个循环就搞定了。

你可能感兴趣的:(HashMap源码学习)