开发者社区> 问答> 正文

我有3个关于HashMap的问题想请大家帮忙解答一下!

我有3个关于HashMap的问题想请大家帮忙解答一下!
HashMap桶的个数是多少?
HashMap put值的时候是怎么put的?
HashMap get值的时候是怎么get的?

展开
收起
codeporter 2018-01-23 22:54:13 1972 0
2 条回答
写回答
取消 提交回答
  • 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.如果当前的桶不采用红黑树,即桶中节点结构为链式结构,如果当前的桶不采用红黑树,即桶中节点结构为链式结构。

    2019-07-17 21:55:57
    赞同 展开评论 打赏
  • http://kodango.com

    可以百度搜索下,推荐这篇:
    http://blog.csdn.net/justloveyou_/article/details/62893086

    2019-07-17 21:55:57
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载