HashMap的底层是一个散列表 即哈希表
哈希表是什么样的数据结构呢?
1.数组加链表的结合体 数组查询效率高 增删效率低 而链表正好相反
Node<K,V>[] 一维数组 存储的元素是Node
class Node<K,V>
2.Node类中 分别有以下的属性:
final int flash key的hashcode执行结果
final K key 存储的key final V value 存储的value
Node <k,v> next 一维数组中存储一个单向链表
Map集合中put(key,value)和get(key)的原理:
put
1.现将key,value封装到Node对象里面
2.调用key的hashcode算法 得出hash值当做数组的索引 如果对应位置不存在元素
Node就会添加到这个位置上
3.如果此位置存在了链表 就用key和每个链表中的key进行equals比较 如果均不相等
新的Node将会加到末尾 如果存在相等 则会替换对应key的value(也是覆盖)
get
1.通过key获得对应的hashcode 转化成数组下标
2.快速定位到对应的位置 如果什么也没有 返回空值null
如果存在单向链表 将key和上面所有的key进行equals对比 找到对应的并返回value值
这样的机制让HashMap的查找和存储效率特别高 不用从头开始找 增删也在链表上完成
重写equals和hashcode
比较内容而不是地址
同一个链表上 hash值都相同 因为数组索引相等
hashcode不能是一个单一的值 否则就是单纯的单向链表 失去意义
如果全不一样 就变成了一维数组
如何保证HashMap的Key不重复且无序呢?
不重复:由于上面介绍的机制 相同的key出现时 会覆盖掉原来的value