见者有缘,缘来好运🍀诚邀各位围观我的博客【CS_GUIDER】👇
🧑💻个人主页: wl2o2o
✒️博客主页: CSGUIDER(好玩) CSGUIDER(实用)
⭐八股专栏: JavaU8G(内置MusicPlayer)
我的开源博客涵盖了八股文、设计模式、网站搭建、数据库、Linux系统的教程和笔记。我致力于为您提供Java编程的实用指南和资源,包括Java框架、JVM、微服务以及Git。无论您是初学者还是经验丰富的开发人员,都可以从中获益。谢谢您的光临!
官方介绍
我的理解
HashMap
又称哈希表,又称散列表。首先,HashMap
的数据结构是基于数组和链表的,如图:
特点
so,既然是基于数组和链表的,那就说明数组和链表的特点也就是HashMap
的特点:
-
数组:寻址快,直接根据索引访问元素,插入和删除慢;
-
链表:寻址慢,需要从头节点开始遍历,插入和删除快。
说到HashMap
就要说到 Java 8 了,Java 8 之前,HashMap
使用一个数组加链表的结构来存储 【K,V】 键值对。
如果发生 hash 冲突,那么,
这必将导致在处理 hash 冲突的时候性能不高,尤其是链表很长的时候。因此,Java 8 中的HashMap
引入了红黑树来替代链表,这样当链表变长的时候,会自动转换为红黑树,从而提高了增删改查的性能。
什么是 Hash 冲突?怎么解决?
哈希冲突就是不同的数据经过哈希计算之后,得到的
hash
值相同,然后被映射到了哈希表中的同一个位置,这就是哈希冲突。
解决方法:
- 开放寻址法
意思就是,一旦发生冲突的话,就去按线性顺序寻找下一个空的散列地址,知道找到存放位置; - 链地址法
就是将哈希表数组的元素作为链表的头结点(这个链表的所有元素构成一个近义词链表,因为经过hash
计算值相同),一旦哈希冲突,就把该关键字链接到该结点的尾部; - 再哈希法
顾名思义,就是再次通过另一个hash
函数计算,得到另外的散列地址,直到冲突不发生; - 建立公共溢出区
将哈希表分为基本表
与溢出表
,发生冲突的元素放入溢出表中。
负载因子为什么是 0.75 ?
对于开放寻址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。超过0.8,查表时的CPU缓存不命中(cache missing)按照指数曲线上升。因此,一些采用开放寻址法的hash库,如Java的系统库限制了荷载因子为0.75,超过此值将resize散列表。
待完善··· ···
如何进行扩容?
如果 pv 达到500,马上进行完善!!!如果有收获,还请点个小指头👍,感谢🍀