散列表的实现是一种在时间和空间上做出权衡的方式。对于数组存储,如果们没有内存限制,则可以直接将数据作为键作为数组的索引,那么所有的查询操作都只需要一次访问内存即可完成。但是当键很多的时候,需要的内存会非常大,所以这种方式不可能实现。另一方面,如果没有时间限制,我们可以对数组进行遍历查找,来查询数组里面的数据。这样会耗费比较多的时间。散列表是一种折中的方法,在这两个极端之间找到一个权衡。
散列表的两个步骤:
第一:利用对象的hashCode()函数,求出对象的hash值,利用hash函数(hash函数有很多,这里使用除留余数法),将对象的hash值映射到内存中去(即求出在数组中的索引)。
第二:在映射的过程中,当两个不同的对象可能会映射到同一个内存单元中时,就发生了碰撞冲突,第二部就是要解决碰撞冲突问题。这里是利用链表,每个数组单元中,存放一个链表。将映射到同一内存单元的多个元素,存放到链表中。
散列表的构造主要就是这两步:
第一:根据hashCode与合适的散列函数算法,将存储对象均匀散列到存储数组中去。哈希算法还有很多种,直接定址法,除留余数法等等
第二:解决碰撞冲突问题。解决方法有,分离链接法,开放定址法等等
这是散列结构的实现,后期我会做一个JAVA实例。