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的幂次方大小来比较,写一个循环就搞定了。