写这篇文章的时候,是大年三十,本来应该和家人一起看春节联欢晚会的,但是看了一个小时感觉没有什么劲,我想今年春晚又会被吐槽吧。哈哈哈哈。书归正传,还是按照我们的老规矩,走起。(PS:本来是早就应该写完的文章,发现自己还是太懒。到了现在真正的写完。反省反省....)
在写这篇文章之前,看了很多关于HashMap解析的文章。对于大多数人来说,可了跟着别人的文章走一遍。大家都能了解HashMap的内部结构,使用方法以及注意事项。我还是觉得知道用是一回事。知道原理是另一回事。只有了解了其数据结构设计初衷。才能更好的使用它。
此系列文章主要分为两个部分,具体目录如下:
- 哈希表初识(一)
- 哈希表之 HashMap(二)
其中第一篇是带领着大家理解为什么会设计此种数据结构,及其遇见的问题及解决办法。我相信通过阅读这篇文章后,你再去理解HashMap,我相信你会有一种豁然开朗的感觉。建议先阅读第一部分。
前言
哈希表是我们程序员开发者经常会使用到的数据结构。我们都知道是其主要用于映射(键值对)关系的数据。哈希表在查找、删除、添加数据方面效率都比较高。既然哈希表有如此多的优点,那么我就带着大家从哈希表实际应用例子出发,通过相应例子,带领大家彻底的了解哈希表的使用情景及其遇到的问题,以及相应的解决方法。
哈希表简介
哈希表(Hash table,也叫散列表),是根据关键值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键键值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。
上文提到了两个比较重要的知识点。哈希表是基于数组且通过哈希函数来构建映射关系。接下来我们通过生活中的几个例子,来了解一下哈希表在实际使用中会出现的问题以及解决方案。
学号作为键,存储学生信息
假如现在我们要做一个学校的学生信息记录。这个学校大概有1000人。学生的记录信息包括学号、年龄、性别等信息。假设学生的学号是从零开始的有序自增长,那么如果要求我们需要从快速检索某一个学生的信息。那我们应该使用什么样的数据结构呢?
我们可能首先想到的就是数组。即数组下标对应着相应学生信息,具体数据结构如下图所示:
如果我们需要找到Jennifer这个学生。我们只需要通过数组下标拿到相应信息就行了。
Student andy = StudentArray[2];
如果我们需要增加一个Jack学生,我们只需要在数组的末尾添加新添加的学生信息。
StudentArray[storeNumber++] = new Student("Jack");
我们发现通过上述结构设计,我们能很快的找到某个学生,或者删除一个学生,因为学生的信息是与学号进行关联的。同时每个学生的学号与数组的下标是相对应的。通过数组下标的操作。我们就能完成我们想要的数据操作。当然上述情况只是理想的数据情况,我们可以直接通过将学号作为数组的下标来作为键值对的映射关系。实际开发常见中,我们并不能遇到如此良好的数据映射关系的。