讲解HashMap之前,我们需要了解一下数组和链表。
数组:采用一段连续的存储单元来存储数据。如:ArrayList
链表:是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。如:LinkedList
优缺点 | 数组(顺序表) | 链表 |
---|---|---|
优点 | 物理上连续,所以查找快 | 空间不连续,逻辑上连续,增删元素快 |
缺点 | 删除和增加元素要大量移动数据,增删慢 | 物理不连续,需要轮询,查找慢 |
hash表
HashMap的put方法
put(k key, v value);
通过key拿到对应的数组的下标,如何key计算的index相同,意味着ha sh冲突。
解决hash冲突(碰撞)的办法:
把值放到链表中去
获取当前节点值得next位置存储
key的作用就是快速定位
value
get(object key)
通过key拿到对应的hash值,根据hash值获取对应的下标,遍历链表
极端情况:
通过key计算的hash值都一样,就变成单链表。LinkedList
如何避免这种情况?
扩容:加载因子
DEFAULF_LOAD_FACTOR = 0.75f
当填充度(hashmap大小)达到(超过)加载因子时,就需要扩容。