热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hashmap简单描述

JDK1.71.数据结构: 数组+链表2.put过程中发生hash碰撞是如何处理的?答:使用“头插法”:将新数据插入当前数组,数组中原数据向链表下(纵向)移动

JDK1.7

  1. 数据结构:  数组+链表

  2. put过程中发生hash碰撞是如何处理的?

    答: 使用 “头插法” :将 新数据 插入当前数组,数组中 原数据 向 链表下(纵向)移动

      

  3. “头插法” 出现的问题?

    答1: 如果一直发生hash碰撞,那么链表就会向下无限的增加下去,链表会变的很长。

       众所周知,链表的特点是:增删快,查询慢。若果链表很长,那么查询就更慢了。

    答2:在多线程的情况下,同一索引位置的节点在扩容后 链表会变成环状 ,导致出现死循环的情况。

  4.什么是hash碰撞?

    答: 两个不同的值(如:张三 、李四),经过hash计算后,得到相同的hash值,后来李四要放到原来张三的位置,但是数组的位置已经被张三占用了,导致的冲突。

JDK1.8

  1. 数据结构: 数组+链表+红黑树

    

  2. put 过程中发生 hash碰撞是如何处理的?

    答: 使用 “尾插法” : 将 新数据 插入当前链表的尾部,使其成为当前链表尾节点。

  3. “尾插法” 解决的问题

    答: 解决“头插法”处出现的死循环

  4. 为什么使用“红黑树”?

    答: 主要是为了提升在hash冲突时(链表过长)的查找性能,使用链表查找性能是O(n) ,使用红黑树查找性能是O(logn) , 提高了查询效率

  5. 什么时候 链表 转 红黑树?

    答:当 链表 长度 大于等于 8 时,由 链表 转成 红黑树

  6. 什么时候 红黑树 转 链表?

    答:当 红黑树上节点数小于等于6时,由 红黑树 转成 链表

  7.  hashmap 什么时候进行扩容 (数组空间不够,需要进行扩容) ?

    答:  数组的默认长度是 :16             扩容因子是 :0.75

       16 * 0.75=12    数组长度使用到12的时候开始扩容

  8. hashmap 是如何扩容的?

    答: 底层是 数组,那么数组是如何扩容的呢?

      寻找一个长度是原数组2倍的新数组进行扩容。

    为什么数组扩容是2倍呢?

      2倍满足,扩容一定的 2的次方 默认要求 ,

      满足这个条件 有利于 计算生成的 hash值 放到hashmap数组中的值(value)更加均匀。

  9. hashmap的put(添加)方法流程

    答: 1. 调用put() 方法   -->底层 调用hashmap类的putval() 方法

       

       2. 首先 根据 key 进行hash运算 

       

       用 key 的 hashCode  与 key的hashcode 右移16位做 异或运算

      3.然后 

  10. 为什么要做hash运算?

     答:查看源码可以看出,通过key计算出 hash值是为了后续key和value放入数组中的位置

        hash值与数组的长度进行计算,放到对应的数组中

        存放到数组中的位置 = key计算出hash值 & n  ( hash值 % 数组的长度(16) = 下标 )

  11. hashmap的重要属性以及有哪些作用?

     答:  <1>  size:hashmap已经存储的节点数

         <2> threshold:扩容阈值,当hashmap的个数达到该值,触发扩容

         <3> loadFactor:负载因子,扩容阈值=容量*负载因子

  12.

 

 

 总结JDK1.8有哪些优化?

   1. 数据结构:

     由“数组+链表” 改成 “数组+链表+红黑树”,主要是优化hash冲突严重时,链表过长的查找性能

  2. 扩容:

     由“头插法” 改成 “尾插法”,避免了并发下的死循环

  3. hsah计算:

    1.8只是简单的进行高16位参与运算

    

 

   4. 其他:

    目前还不太清楚

    

结束语:

  好了,目前小编的技术能力就到这里了,其他问题正在努力学习中......

 

 

 

  

  

  

 

 

 

 

 

 

 



推荐阅读
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文详细介绍了如何在PHP中删除数组中的指定元素、第一个元素和最后一个元素,并提供了具体的代码示例和相关函数的使用说明。 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • 优化网页加载速度:JavaScript 实现图片延迟加载
    本文介绍如何使用 JavaScript 实现图片延迟加载,从而显著提升网页的加载速度和用户体验。 ... [详细]
  • 探讨在PHP开发中,如何选择使用Cookie或数据库来优化网站性能,特别是在处理用户保存的搜索结果时。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
author-avatar
霍任芳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有