JAVA中HashMap常见面试点及实现原理

HashMap是一种高效的数据存储结构,基于数组和链表实现。其查询效率高,平均时间复杂度为O(1)。加载因子0.75是经过统计学优化的选择,平衡了空间利用率和冲突概率。在不同JDK版本中,链表插入策略有所不同,1.7采用头插入,1.8改为尾插入。此外,数组长度必须为2的n次幂,以优化索引计算。了解这些原理有助于提升Java编程中的性能。
摘要由CSDN通过智能技术生成

HashMap数据结构简介

HashMap底层是用数组+链表的数据结构实现的,产生hash碰撞的少,也就是产生链表少和链表中元素少,则查询效率高,达到O(1)复杂度。

HashMap常见面试点及原理

  1. HashMap在添加元素发生hash碰撞时,链表是采用头插入还是尾插入?
    在jdk1.7采用的是头插入,jdk1.8采用的是尾插入
  2. HashMap默认加载因子为什么是0.75?
    jdk源码有注释,若加载因子过小,空间无法得到充分利用,若过大,则容易产生hash碰撞,产生链表,导致查询效率低下,通过统计学规律及折中和权衡,选择0.75比较合适
  3. 加粗样式HashMap底层数组长度为什么是2的n次幂?**
    因为HashMap为元素找位置,即indexFor方法,将hash和数组长度取模运算是通过将数组长度减一和元素hash值按位与运算,不是2的n次幂,就不能用这种方法取模;减少hash冲突,读者可以拿数组长度是8和9,两个元素的hash值分别是3和2,推算一下以证明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值