博客
关于我
HashMap集合原理
阅读量:520 次
发布时间:2019-03-08

本文共 867 字,大约阅读时间需要 2 分钟。

HashMap的结构与操作原理


HashMap的结构

HashMap在JDK8以后由数组、链表和红黑树组成。其核心思想是通过哈希函数将数据分布到数组中,减少直接碰撞的可能性。当链表长度超过8时,HashMap会将链表自动转换为红黑树,以提高查找效率。


扩容机制

rozšíření的原因

  • 均匀散列:避免链表过长,提升查找效率。
  • 性能优化:减小哈希冲突率,提高操作效率。

when扩容?

当HashMap的内存使用率达到默认加载因子(0.75)时自动扩容,新容量为原容量的两倍。

how扩容?

  • 新建数组:容量为原数组的两倍。
  • 数据转移:使用transfer方法将数据迁移到新数组。
  • 节点重定位:每个节点要么保持原位,要么移动至新数组的相同位置。

  • 数据插入流程

    插入步骤:

  • 计算哈希值key.hashCode() & (length - 1)
  • 定位数组位置:通过哈希值计算索引位置。
  • 检查存在性:遍历链表,检查是否存在相同key。
  • 存储数据:若无重复key,插入链表头部或尾部;若已存在key,直接替换值。

  • 取得数据流程

    取得步骤:

  • 计算哈希值key.hashCode() & (length - 1)
  • 定位数组位置:通过哈希值找到索引位置。
  • 遍历链表:查找是否存在相同的key,逐一比较。
  • 返回值:找到匹配项时返回值,否则返回null。

  • 其他考虑事项

    key均匀分布的重要性

    使用h & (length - 1)而非取模运算,避免频繁调用取模运算(计算开销较大)。

    初始化容量建议

    • 容量应为2的幂次方(如16、32、64等),以确保哈希分布均匀,减少冲突。

    自定义对象的注意事项

    • 覆写hashCode和equals方法,确保 searchData中能找到正确的对象。

    操作次数统计

    HashMap记录操作次数modCount,用于批量操作时防止未已意修改。


    总结

    HashMap通过数组+链表+红黑树结构,实现高效的数据存储与查找。其扩容机制和哈希算法设计使其在实际应用中表现优异。理解这些细节对优化代码和调试问题都有重要帮助。

    转载地址:http://kpkiz.baihongyu.com/

    你可能感兴趣的文章
    HDU——3374 String Problem (最大最小表示法+循环节+kmp)
    查看>>
    求1-n中x(0-9)的个数
    查看>>
    SQL server 2016安装
    查看>>
    Excuses, Excuses! map的应用
    查看>>
    搭建nfs服务器练习
    查看>>
    linux 编译出现的错误
    查看>>
    如何保证消息队列的高可用?
    查看>>
    Flutter-Dart version solving failed
    查看>>
    常见状态码
    查看>>
    MYISAM存储引擎
    查看>>
    什么情况必须使用 statement
    查看>>
    账号转账演示事务
    查看>>
    idea创建工程时错误提醒的是architectCatalog=internal
    查看>>
    E - Another Postman Problem FZU - 2038
    查看>>
    【JavaLearn】 # 培训(一)—— JavaSE查漏补缺
    查看>>
    SpringBoot找不到@EnableRety注解
    查看>>
    简易计算器案例
    查看>>
    在Vue中使用样式——使用内联样式
    查看>>
    @pathVariable 映射URL绑定的占位符
    查看>>
    案例:验证用户名是否可用
    查看>>