文章目录
Hash
什么是hash
hash,翻译散列或哈希,就是把任意长度的输入(也叫预映射),通过哈希算法,得到固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间一般远小于输入空间,正因如此,所以不同的输入可能会得到相同的散列值。所以不能通过散列值唯一确定输入值。简单来书就是一个将任意长度的消息压缩的到固定长度的消息摘要的函数。
特点
相同对象的hash值一定相同,不同对象的hash值可能相同。
将任意长度映射为固定长度,因为映射后的长度比他短,所以可能发生hash冲突。
常见Hash函数
直接取余法
乘数去整法
平方取中法
HashCode
HashCode也是通过hash得到的,代表对像在hash表中的位置,本质还是一个Hash函数,得到的整数值就是散列值。(不同对像的HashCode的算法不同)。
虽然hashCode代表的是在Hash表中的位置,但是这个位置是通过hash函数得到的,而不是查找hash表得到的。
简要来说就是通过算法得到对象在hash表中的位置,该位置通过hashCode来表示。
这也是为什么向HashMap这种为什么不能用基本数据类型,因为没办法得到hashCode。
Object.hashCode()
调用对像的hashCode方法,是一个native方法,此时是将对像所在物理地址位置转换为的整数,在通过hash函数计算,得到一个整数值返回。如果两个对象equals相同,那么hashcode必定相同,这也是为什么当我们定义一个对象时,一般重写equals和hashcode的原因。
equals和hashcode:
如果不重写,那么new出的所有对象都是不相同的(equals不同,equals默认比较的是两个引用对象的地址,所以一定不同,但一般由于我们认为值相等即可,那么就要重写equals方法,又因为hashcode和equals是有关联的,所以也要重写hashcode方法)。
如果两个对象equals相同,那么hashcode一定相同。
如果两个对象hashcode不同,那么equals一定不同。
Objects.hashCode(),Arrays.hashCode()
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
//这个是Array.hashCode()
public static