怎么理解HashMap的数据结构、怎么解决冲突、扩容(面试必问版)


2024一起卷吧

见者有缘,缘来好运诚邀各位围观我的博客【CS_GUIDER】
‍个人主页: wl2o2o
✒️博客主页: CSGUIDER(好玩) CSGUIDER(实用)
⭐八股专栏: JavaU8G(内置MusicPlayer)

我的开源博客涵盖了八股文、设计模式、网站搭建、数据库、Linux系统的教程和笔记。我致力于为您提供Java编程的实用指南和资源,包括Java框架、JVM、微服务以及Git。无论您是初学者还是经验丰富的开发人员,都可以从中获益。谢谢您的光临!

目录

  • 官方介绍
  • 我的理解
    • 特点
    • 什么是 Hash 冲突?怎么解决?
    • 负载因子为什么是 0.75 ?
    • 如何进行扩容?

官方介绍

怎么理解HashMap的数据结构、怎么解决冲突、扩容(面试必问版)_第1张图片

我的理解

HashMap又称哈希表,又称散列表。首先,HashMap的数据结构是基于数组和链表的,如图:

怎么理解HashMap的数据结构、怎么解决冲突、扩容(面试必问版)_第2张图片

特点

so,既然是基于数组和链表的,那就说明数组和链表的特点也就是HashMap的特点:

  • 数组:寻址快,直接根据索引访问元素,插入和删除慢;

  • 链表:寻址慢,需要从头节点开始遍历,插入和删除快。

说到HashMap就要说到 Java 8 了,Java 8 之前,HashMap使用一个数组加链表的结构来存储 【K,V】 键值对。

如果发生 hash 冲突,那么,

这必将导致在处理 hash 冲突的时候性能不高,尤其是链表很长的时候。因此,Java 8 中的HashMap引入了红黑树来替代链表,这样当链表变长的时候,会自动转换为红黑树,从而提高了增删改查的性能。

什么是 Hash 冲突?怎么解决?

哈希冲突就是不同的数据经过哈希计算之后,得到的
hash值相同,然后被映射到了哈希表中的同一个位置,这就是哈希冲突。

解决方法:

  1. 开放寻址法
    意思就是,一旦发生冲突的话,就去按线性顺序寻找下一个空的散列地址,知道找到存放位置;
  2. 链地址法
    就是将哈希表数组的元素作为链表的头结点(这个链表的所有元素构成一个近义词链表,因为经过hash计算值相同),一旦哈希冲突,就把该关键字链接到该结点的尾部;
  3. 再哈希法
    顾名思义,就是再次通过另一个hash函数计算,得到另外的散列地址,直到冲突不发生;
  4. 建立公共溢出区
    将哈希表分为基本表溢出表,发生冲突的元素放入溢出表中。

负载因子为什么是 0.75 ?

对于开放寻址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。超过0.8,查表时的CPU缓存不命中(cache missing)按照指数曲线上升。因此,一些采用开放寻址法的hash库,如Java的系统库限制了荷载因子为0.75,超过此值将resize散列表。

待完善··· ···

如何进行扩容?

如果 pv 达到500,马上进行完善!!!如果有收获,还请点个小指头,感谢

你可能感兴趣的:(数据结构,面试)