我有3个关于HashMap的问题想请大家帮忙解答一下!
HashMap桶的个数是多少?
HashMap put值的时候是怎么put的?
HashMap get值的时候是怎么get的?
HashMap桶的个数是动态变化的,在创建HashMap时,如果没有指定initialCapacity,默认是16,如果指定initialCapacity,由于HashMap的capacity都是2的幂,因此会调用tableSizeFor方法找到大于等于initialCapacity的最小的2的幂(initialCapacity如果就是2的幂,则返回的还是这个数)。之后在put数值后,会判断元素数量是否大于threshold(threshold=initialCapacity*loadFactor),如果大于,会调用resize方法,执行newCap = oldCap << 1;newThr = oldThr << 1
, 将桶的个数乘以2。
HashMap put值的时候调用的是putVal方法,共分为以下几步:
1.如果当前map中无数据,执行resize方法。
2.如果要插入的键值对要存放的这个位置刚好没有元素,那么把他封装成Node对象,放在这个位置上就完事了。
3.否则的话,如果这个元素的key与要插入的一样,那么就替换一下,也完事。
4.如果当前节点是TreeNode类型的数据,执行putTreeVal方法
5.判断阈值,决定是否扩容
HashMap get值的时候调用的是getNode方法,共分为以下几步:
1.如果哈希表为空,或者没有找到节点,返回null
2.如果桶中的第一个节点就和指定参数hash和key匹配上了,返回桶中的第一个节点
3.如果桶中的第一个节点没有匹配上,而且有后续节点,如果当前的桶采用红黑树,则调用红黑树的get方法去获取节点。
4.如果当前的桶不采用红黑树,即桶中节点结构为链式结构,如果当前的桶不采用红黑树,即桶中节点结构为链式结构。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。