作者:阿进的写字台 来源:https://www.cnblogs.com/homejim/p/10029796.html
1、HashMap在JAVA中的怎么工作的?
基于Hash的原理。
2、什么是哈希?
最简单形式的 hash,是一种在对任何变量/对象的属性应用任何公式/算法后, 为其分配唯一代码的方法。
一个真正的hash方法必须遵循下面的原则。
哈希函数每次在相同或相等的对象上应用哈希函数时, 应每次返回相同的哈希码。换句话说, 两个相等的对象必须一致地生成相同的哈希码。
Java 中所有的对象都有 Hash 方法。
Java中的所有对象都继承 Object 类中定义的 hashCode() 函数的默认实现。 此函数通常通过将对象的内部地址转换为整数来生成哈希码,从而为所有不同的对象生成不同的哈希码。
3、你清楚HashMap 中的 Node 类的结构吗?
Map的定义是: 将键映射到值的对象。
因此,HashMap 中必须有一些机制来存储这个键值对。 答案是肯的。 HashMap 有一个内部类 Node,如下所示。
当然,Node 类具有存储为属性的键和值的映射。 key 已被标记为 final,另外还有两个字段:next 和 hash。
在下面中, 我们将会理解这些属性的必须性。
4、键值对在 HashMap中是如何存储的?
键值对在 HashMap 中是以 Node 内部类的数组存放的,如下所示。
transient Node[] table;
哈希码计算出来之后, 会转换成该数组的下标, 在该下标中存储对应哈希码的键值对, 在此先不详细讲解hash碰撞的情况。
该数组的长度始终是2的次幂, 通过以下的函数实现该过程。
其原理是将传入参数 (cap) 的低二进制全部变为1,最后加1即可获得对应的大于 cap 的 2 的次幂作为数组长度。