面试中一个hashmap到底能问出什么?看完这个我终于明白了

本文详细探讨了HashMap在面试中的常见问题,包括初始化大小、扩容机制、线程安全性和数据结构。建议在定义HashMap时指定初始化大小以避免频繁扩容导致性能下降。HashMap在容量达到16*0.75时会扩容到2的指数次幂,如16到32。线程不安全主要体现在多线程环境下数据覆盖和扩容时的死循环。HashMap采用数组+链表+红黑树的数据结构,JDK1.8中引入红黑树提高查询效率。文章还介绍了HashMap的工作原理,存储方式和解决哈希冲突的方法。
摘要由CSDN通过智能技术生成

前言:

hashmap是面试中问的最多的一道题,关于它的底层原理和扩容机制是必问的。根据你对hashmap的回答,面试官能对你的基础和技术有个大致的了解。这篇文章主要介绍了JAVA关于HashMap容易被提问的面试题,因为好久没看的原因,所以今天就总结一下。文中题目提问频率高的几道题,本人在网上总结到的,相信对你的面试有一定帮助,想要入职JAVA的朋友可以了解下。

在这里插入图片描述

另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,下方只是部分截图 想要资料的话也可以点击795983544领取 暗号CSDN。
在这里插入图片描述
1.为什么我们建议在定义HashMap的时候,就指定它的初始化大小呢?

答:在当我们对HashMap初始化时,如果没有为其设置初始化容量,那么系统会默认创建一个容量为16的大小的集合。当我们向HashMap中添加元素时,如果HashMap的容量值超过了它的临界值(默认16*0.75=12)时,(0.75是HashMap的加载因子)HashMap将会重新扩容到下一个2的指数次幂(2^4=16 下一个2的指数次幂是2^5=32)。由于HashMap扩容要进行resize的操作,频繁的resize,会导致HashMap的性能下降,所以建议在确定HashMap集合的大小的情况下,指定其初始化大小,避免做过多的resize操作,导致性能下降。

2.HashMap什么时候进行扩容?

答:当我们不断的向HashMap中添加元素时,它会判断HashMap当前的容量值(当前元素的个数)是否超过了它的临界值(在没有指定其初始化大小时,默认16*0.75=12),如果添加的元素个数超过了临界值,它就会开始进行扩容。

3.HashMap在扩容时,扩容到多大?

答:HashMap在扩容时,它会扩容到下一个2的指数次幂,即当前容量的2倍,比如当前容量是24=16,将会扩容到下一个2的指数次幂25=32.

4.HashMap是如何进行扩容的?

答:HashMap进行扩容时会调用resize()函数,重新计算HashMap所需的新的容量,然后重新定义一个新的容器,将原数组数据进行Hash, 放入新的容器中。这个过程将会导致HashMap的性能下降。

resize()函数的源码:

//HashMap 扩容操作
final Node<K,V>[] resize() {
   
  //保存当前table
  Node<K,V>[] oldTab = table;
  //保存当前table的容量
  int oldCap = (oldTab == null) ? 0 : oldTab.length;
  //保存当前阈值
  int oldThr = threshold;
  //初始化新的table容量和阈值
  int newCap, newThr = 0;
  
  //1. resize()函数在size(HashMap当前的元素个数) > threshold(当前阈值,默认16*0.75=12)时调用。
  //当oldCap(HashMap的元素个数)大于0表示原来的table表非空,oldCap(threshold)为oldCap x load_factor(加载因子:0.75)
  if (oldCap > 0) {
   
    //若旧table容量大于等于最大容量,更新阈值为Integer.MAX_VALUE(最大整形值),这样以后就不会自动扩容了
    if (oldCap >= MAXIMUM_CAPACITY) {
   
      threshold = Integer.MAX_VALUE;
      return oldTab;
    }
   //扩容到下一个2的指数次幂,容量翻倍,使用左移&#
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
HashMap是一种基于哈希表的数据结构,它通过哈希函数将键映射到表的位置来实现快速的查找。具体来说,HashMap内部维护了一个数组,每个数组元素都是一个链表的头节点,链表存储了哈希值相同的键值对。当我们向HashMap添加一个键值对时,首先会根据键的哈希值计算出在数组的位置,然后将该键值对插入到对应链表的末尾。当我们需要查找一个键对应的值时,HashMap会先根据键的哈希值找到对应的链表,然后在链表顺序查找该键对应的值。 在HashMap,哈希函数的作用非常重要,它决定了键值对在数组的位置。JavaHashMap使用了两个哈希函数:hashCode()和equals()。hashCode()方法用于计算键的哈希值,equals()方法用于判断两个键是否相等。当我们向HashMap添加一个键值对时,HashMap会先调用键的hashCode()方法计算出哈希值,然后根据哈希值找到对应的数组位置。如果该位置上已经有了链表,HashMap会遍历链表的每个键值对,调用equals()方法判断该键值对是否已经存在。如果存在,则更新对应的值,否则将该键值对插入到链表的末尾。 当HashMap的键值对数量达到一定阈值时,HashMap会自动进行扩容,重新分配数组大小,并将所有键值对重新插入到新的数组。这个过程比较耗时,因此我们在使用HashMap时应该尽量避免频繁的扩容操作。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值