整理所学之HashMap | 第一篇
Posted bloodthirsty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整理所学之HashMap | 第一篇相关的知识,希望对你有一定的参考价值。
本文参考:
https://blog.csdn.net/yyyljw/article/details/80903391
https://www.jianshu.com/p/a89e9487a06c
https://blog.csdn.net/woshimaxiao1/article/details/83661464
https://blog.csdn.net/eaphyy/article/details/84386313
所学浅薄,抛砖引玉。
这里会涉及:
1. 哈希表
2. HashMap 的hash算法
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
3. HashMap 查找数组下标为什么是
(n - 1) & hash
哈希表
散列表(也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
来让我们在研究哈希表之前,先看下其他数据结构
数组:是在内存中存储相同数据类型的物理上连续的空间。特点:查找快,插入、删除等更新操作慢。
线性链表:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。特点:查找慢,插入、删除等更新操作快。
那么,是否可以设计一种数据结构,结合数组和链表?这就是哈希表。
哈希表特征:
1. 哈希表的存储是key、value形式的。
2. 哈希表的主干就是数组,数组的下标是通过函数确定的,即:地址index=f(key),这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。
3. 数组的元素是链表形式
例子:
现有一个Person类包含name(假设姓名唯一)跟age的两个属性,要从1000个Person对象中找出name为“张三”的对象你该怎么做?
有些同学要说话了:将1000个Person对象放入ArrayList中,再遍历ArrayList找出name为“张三”的对象不就得了。
是的这种方法是可以的,但是假如张三恰好在最后一个那么就意味着要遍历1000次,这样效率就会非常低下,那么我们有没有什么办法来解决这种问题呢?
这个例子哈希表的解决方案,参见:TODO
以上是关于整理所学之HashMap | 第一篇的主要内容,如果未能解决你的问题,请参考以下文章