48 容器(七)——HashMap底层:哈希表结构与哈希值算法

时间:2019-12-11
本文章向大家介绍48 容器(七)——HashMap底层:哈希表结构与哈希值算法,主要包括48 容器(七)——HashMap底层:哈希表结构与哈希值算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

哈希表结构

哈希表是由数组+链表组成的,首先有一个数组,数组的每一个位置都用来存储一个链表,链表的基本节点为:【hash值,key值,value值,next】,当存入一个键值对时,首先调用hashcode()方法获得key的hashcode,然后通过算法计算出hash值,当不同的key取到相同的hash值时,后面的key作为一个节点连接到前一个相同hash值的key的节点。

hash值的算法

最差的算法:hashcode/hashcode 会将所有的元素存储在数组的下标1位,实际上已经退化为一个数组

常用的算法是:hashcode%数组长度

通过这个算法将得到[0,数组长度-1]的值,即hash值。这种算法可以使各key尽可能均匀的分布在数组中。这种表也称作“散列表”。

优化算法:同样是取余数,但是进行了优化。首先约定数组的长度为2的整数幂,然后通过位运算快速得道hash值:hashcode&(数组长度-1)

下面验算一下算法:

public class Test {
	public static void main(String[] args) {
		Test t = new Test();
		//算法:hashcode%数组长度,假设数组长度为16(2的4次方)
		System.out.println(t.hashCode()%16);
		System.out.println(t.hashCode()&(16-1));
	}
}

结果:
2
2

  

后面又优化了一次,是目前使用的hash值算法(我看不懂):

原文地址:https://www.cnblogs.com/Scorpicat/p/12021680.html