哈希表在Java集合中属于HashSet和HashMap的底层实现,它的查找效率非常的高,优于前面所学的链表顺序表,二叉搜索树等等,并且更是作为现代分布式系统的基础,由此可见它在众多数据结构中的重要性,下面具体实现一个哈希表。
哈希表主要由两个部分组成
1.一个数组
2.记录实际元素个数的变量size
具体实现过程就是把我们需要存储的元素映射成数组下标进行存储,当需要对哈希表进行操作的时候就根据映射出来的这个哈希值来访问具体的元素。
比如说给定我们若干个数字0——99之间,然后我们需要判断哪个数字是否存在于给定序列中,我们就可以把这个序列映射成数组下标,然后存储到数组中即可,具体如何映射的哈希函数有很多种,像这种简单的可以直接模上数组长度。当我们需要查找的时候可以直接将要查找的元素同样模上数组长度,然后访问具体数组下标即可。这也就是哈希表查找效率高的原因。
哈希冲突:
当元素很多的时候,难免会出现不同的key映射出来的哈希值相同,也就是通过计算得出来的数组下标一样了。这就叫哈希冲突。解决方法有两种
1.闭散列:
核心操作就是在冲突位置依次往后找一个位置来存放这个冲突元素。当我们需要对这个元素进行操作的时候同样是先算出它的哈希值,然后从哈希值位置依次往后进行判断是否是这个元素,当找到这个元素的时候再进行一系列的操作。此时的时间复杂度就不再是O(1)了,而是取决于哈希冲突的严重性。冲突越严重效率也就越低,所以我们选取数组长度的时候也需要仔细考虑,尽量让算出来的哈希值保证唯一性。
2.开散列:
核心操作就是将顺序表或者链表或者二叉搜索树或者再一个哈希表来作为当前哈希表中数组的元素,当遇到哈希冲突元素的时候,就直接放入这个位置上的表或者树中即可,