常识:哈希法
散列法(Hashing)或哈希法是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,
称为散列法,也叫哈希法。
1.什么是HashMap?
HashMap是基于哈希表的Map接口的非同步实现, 实际上是一个“链表散列”的数据结构,即数组和链表的结合体.
也可以说是一个用于存储Key-Value键值对的集合,每一个键值对也叫作Entry.
这些个键值对分散存储在一个数组中,这个数组就是HashMap的主干;
数组中的每一个元素的初始值都是Null.
2.你为什么会用HashMap?
HashMap可以接收null键值和值,而HashTable则不能;
HashMap是非同步的,相对而言会很快;
HashMap存储的是键值对,以一种数据之间的对应关系.
3.简述一下HashMap的工作原理
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,
它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。
当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。
HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。
HashMap在每个链表节点中储存键值对对象。
4.你知道HashMap的get()方法的工作原理吗?
首先根据对象的Hash值进行数组方面的寻找,然后找到这个数组之后,判断key是否唯一,如果是唯一则直接返回,
如果不唯一,则使用equals进行值的判断,最后返回数据.
5、当两个对象的hashcode相同会发生什么?
因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象) 会存储在链表中。这个时候要理解根据hashcode来划分的数组,如果数组的坐标相同,则进入链表这个数据结构中了,一般的添加都在最前面,也就是 和数组下标直接相连的地方,链表长度到达8的时候,jdk1.8上升为红黑树
6、如果两个键的hashcode相同,你如何获取值对象?
当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象;
如果有两个值对象储存在同一个bucket,将会遍历链表直到找到值对象。
找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。