整理所学之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

猜你喜欢

转载自www.cnblogs.com/bloodthirsty/p/12015813.html