一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
前言
在我们的日常开发中肯定会使用到各种各样的集合类,包括List,Map等等的实现类,那么我们最常用的一个Map实现类就是HashMap类了,不知道大家是否知道它为什么叫做HashMap,因为它的底层的数据结构的实现就是我们今天要讲的主题——散列表。
散列表
散列表又称为“哈希表”,它是基于数组支持根据数据下标随机访问的数据的特性而来的,所以散列表相当于数组的一种扩展的数据结构演化而来的。假设我们举办一场马拉松,有50个人来参加。我们分别为这50个人进行编号1-50号,如果我们想根据编号来迅速找到其中的某个选手的时候需要怎么做呢?首先,我们可以定义一个的数组,把50个选手的号码都依次放入数组中,1号放在索引下表为1的,2号放2的,以此类推,我们将50个选择都放置完毕了。那么我们要查找某个选手的时候,根据数组下标就可以立马找到了,这时候的时间复杂度是O(1),但是在我们日常生活中,编号没有那么简单的。可能会几位,首位为一些字母标记,年龄等一些参数的,最后才是编号的号码。这样形成的一个选手号码要如何处理呢?这时候我们就要讲到了Hash函数了。Hash函数的作用就是会将一个关键字key值,计算出来的散列值,映射到某一个位置,比如上面的例子,我们的Hash函数就可以是,将前面的参数进行忽略,截取最后的两位号码,映射到数组的具体位置。这样我们就可以将元素放置到对应的位置上。支持O(1)的查找速度。
总结
散列表是一个非常有用的数据结构,很多问题的场景下,都有散列表的一席之地。