博客
关于我
阿里面试官崩溃,一个小小的HashMap扯半个小时
阅读量:185 次
发布时间:2019-02-28

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

HashMap的核心原理与面试经历

HashMap的内部结构与插入原理

HashMap作为Java中最常用的非线程安全的集合,其内部结构和插入原理是面试中常见的重点话题。HashMap的核心思想是通过数组和链表或红黑树的结合,实现高效的数据存取操作。具体来说,HashMap采用数组存储键值对的位置索引,而通过哈希函数计算键的位置。哈希函数的设计非常关键,既要降低碰撞概率,又要保证插入和查找操作的高效性。

HashMap的哈希函数与碰撞解决方案

HashMap的哈希函数设计分为两部分:首先,计算键的哈希值,然后将其与数组长度-1进行按位与操作,从而得到实际存储位置。这种操作比传统的取模运算更高效,避免了溢出问题。为了进一步降低碰撞概率,HashMap引入了扰动函数。扰动函数通过将哈希值的高位与低位混合,减少碰撞的可能性。具体实现是对哈希值进行四次移位和异或操作,混合了高位和低位的信息。

!图片描述被移除

HashMap的优化变化

随着时间的推移,HashMap不断进行了优化。Java 1.8相比1.7在性能和安全性上有了显著提升:

  • 链表转换为红黑树的条件:在1.7中,链表长度达到8时会被转换为红黑树。而1.8将这个阈值降低为6,进一步优化了查找性能。
  • 插入方式优化:1.7使用头插法可能导致链表反转,影响多线程环境下的安全性。1.8改用尾插法,避免了链表反转问题。
  • 扩容逻辑优化:1.7在扩容时需要重新计算所有键的哈希值,1.8则通过简单的逻辑判断,直接定位原数组中的节点到新数组的位置,提升了扩容效率。
  • 线程安全问题与解决方案

    尽管HashMap本身是非线程安全的,但在多线程环境下仍然可能出现问题。解决方案包括:

  • 使用线性化的Map:如Hashtable,通过对方法进行同步锁定。
  • 使用包装类:如Collections.synchronizedMap,通过对象锁实现线程安全。
  • 使用并发包裹Map:如ConcurrentHashMap,采用分段锁策略,锁粒度更小,支持更高的并发度。
  • !图片描述被移除

    LinkedHashMap与TreeMap的实现

    除了默认的HashMap,Java还提供了其他类型的Map,如LinkedHashMapTreeMap,它们以不同的方式实现有序性:

    • LinkedHashMap:通过维护一个双向链表,记录插入或访问顺序,实现按访问顺序排列。
    • TreeMap:基于红黑树的结构,按照键的自然顺序或自定义比较器进行排序。

    !图片描述被移除

    最后

    面对HashMap的面试问题,重点突出其内部结构、哈希函数、优化变化以及线程安全等方面的知识。通过结合实际项目经验和代码理解,能够更深入地解答相关问题。如果对某些细节还有疑问,可以参考Java官方文档或相关技术博客,进一步加深理解。

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

    你可能感兴趣的文章
    Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
    查看>>
    Openlayers实战:非4326,3857的投影
    查看>>
    Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
    查看>>
    Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
    查看>>
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>