哈希表的特征和原理
哈希表也叫散列表,是一种神奇的结构,最大的特点就是快。它的结构有很多种,最流行、最容易理解的是:顺序表+链表的结构。主结构是长度可以动态变化的顺序表,每个顺序表的节点可以单独引出一个链表。哈希表的原理可以从以下三点阐述。
添加数据原理:
1)、计算哈希码,调用hashCode()方法,结果是一个int值,整数的哈希码取自身即可
2)、根据哈希码计算存储位置(数组的索引)【y = k(x) (除留取余法)存入哈希表】
3)、将数据存入指定位置,如果已经有元素存在,就是出现了冲突,需要沿着链表比较,有重复的元素,不存储。没有,就存储。
结论:添加快。时间复杂度O(1);无序。
查询数据的原理:
和添加过程一样,还是三步搞定。结论:查询快。
总结:哈希表的神奇之处在于按照内容查询,理想情况下可以达到数组索引查询的时间复杂度O(1)。核心在于其查询不是基于比较的,而是基于计算的。当存在冲突时,会降低效率。
如何减少冲突:
1)装填因子:哈希表的长度和表中的记录数的比例。超过装填因子就要扩容。不然冲突的概率会大大提高,从而影响性能。
2)哈希函数的选择
直接定址法 平方取中发 折叠法 除留取余法等
3)处理冲突的方法
链地址法 开放地址法 再散列法 建立一个公共溢出区
hashCode和equals()在哈希表添加查询中的作用:
1)hashCode():计算哈希码,是一个整数,根据哈希码可以计算出数据在哈希表中的存储位置。
2)equals():添加时出现了冲突,需要通过equals进行比较,判断是否相同,查询时也需要使用equals进行比较,判断是否相同。
Develop good habits and use them to cover up bad habits.