HashMap
又称哈希表,又称散列表。首先,HashMap
的数据结构是基于数组和链表的,如图:
so,既然是基于数组和链表的,那就说明数组和链表的特点也就是HashMap
的特点:
数组:寻址快,直接根据索引访问元素,插入和删除慢;
链表:寻址慢,需要从头节点开始遍历,插入和删除快。
说到HashMap
就要说到 Java 8 了,Java 8 之前,HashMap
使用一个数组加链表的结构来存储 【K,V】 键值对。
如果发生 hash 冲突,那么,
这必将导致在处理 hash 冲突的时候性能不高,尤其是链表很长的时候。因此,Java 8 中的HashMap
引入了红黑树来替代链表,这样当链表变长的时候,会自动转换为红黑树,从而提高了增删改查的性能。
哈希冲突就是不同的数据经过哈希计算之后,得到的
hash
值相同,然后被映射到了哈希表中的同一个位置,这就是哈希冲突。
解决方法:
hash
计算值相同),一旦哈希冲突,就把该关键字链接到该结点的尾部;hash
函数计算,得到另外的散列地址,直到冲突不发生;基本表
与溢出表
,发生冲突的元素放入溢出表中。对于开放寻址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。超过0.8,查表时的CPU缓存不命中(cache missing)按照指数曲线上升。因此,一些采用开放寻址法的hash库,如Java的系统库限制了荷载因子为0.75,超过此值将resize散列表。
待完善··· ···
如果 pv 达到500,马上进行完善!!!如果有收获,还请点个小指头,感谢