数据结构中:
用来映射元素关键字(能唯一标识该元素,类似数据库中的主键可以唯一标识一条记录)和元素的内存地址的关系(解决树,线程表等结构中元素和位置无确定关系,查找时需要进行不断比较的问题。顺序查找的比较结果是=和不等。树查找的比较结果是>,<和=)。这种描述关键字/元素内容和存储位置之间的关系的函数就叫做哈希函数(按java里的hashcode来看只要是建立两种变量的映射关系的函数都可以叫做哈希函数),按这种思想建立的表叫哈希表。
哈希表:
根据设定的哈希函数和处理冲突的方法将一组关键字映像到一个有限的连续的地址集上,并以关键字在地址集中的像作为记录在表中的存储位置(没说是内存地址)。这一映像过程称为哈希造表或散列,所得存储位置称为哈希地址或散列地址。
java中:
为什么需要hashCode?
java中的hashCode主要为了提升集合中查找对象的效率。假如向一个不允许有重复元素存在的集合中添加元素,需要先查出所有元素意义比对是否有相同的元素,可以重写equals方法(默认的equals方法的实现只是比较内存地址是否相同,不比较值)然后一一去比对。比对的过程中,每个对象的字段有多有少,还要一一比较每个属性值。如果用hashcode的话可以
java中hashcode()方法是Object的方法,不能被基本类型调用。此方法基于内存地址返回一个不固定位数的int型整数。同一个对象的hashcode一定是一样的。不同对象的hashcode也可能一样(产生哈希碰撞)。
哈希碰撞:
经过相同的哈希函数,不用的变量产生相同的映像的现象即哈希碰撞。
解决:
1.再哈希法:产生哈希碰撞时计算另一个哈希函数地址。
2.链地址法:(将相同哈希地址的元素存到另一条链上,由哈希地址指向该链,有序排列)