HashMap为何存取效率那么高?

一、Hash

也叫散列、哈希。java

主要用于信息安全领域中的算法,把长度不一样的信息转化为杂乱的128位的编码,找到一种数据内容与地址之间的映射关系。算法

注意:不一样的输入可能会散列成相同的输出数组

咱们最熟悉的Object类中就提供了hashcode的方法。安全

public native int hashCode();


二、数据结构

Java集合的实现底层大都是基本数据结构的又一层封装。markdown

数组:寻址容易,插入和删除困难数据结构

链表正好相反。性能

HashMap正好将两者互补了一下,推出了链表+数组的组合方式,也叫链表散列、“拉链法”。优化

结构示意图:编码

这里写图片描述

放入元素时,根据key值经过hashcode找到对应数组的位置,放入横向数组的某个格子中。由于前面说到hashcode值不能保证惟一,若是以后hashcode值对应的数组位置中已经有值,就放到相连的链表中。spa

查找元素也是按这个过程来进行。

代码实现:

注意:每一个Node中都持有下一个节点的引用。
这里写图片描述

三、算法优化

由上面的数据结构介绍,能够看出,在查找的时候,尽可能避免查找链表可以大大提升存取效率。

目标:元素尽量均匀分布,这样查找的时候没必要查找链表,效率很高。

思路一:

取模运算,实现是能够实现,但取模运算消耗大、效率不高。

思路二:

首先,&运算比取模运算效率高。
hashmap采用的是下面这种与运算。

这里写图片描述

大同小异,都是为了减小碰撞,避免hash到同一个位置,使元素分布更均匀。在实现的基础上,考虑性能问题。

相关文章
相关标签/搜索