Java 中 hash 值的含义
- hash 值主要是用来在散列存储结构中确定对象的存储地址的,提高对象的查询效率,如HashMap、HashTable等;
- 如果两个对象相同,那么这两个对象的 hash 值一定相等;
- 如果要重写对象的 equals 方法,那么尽量重写对象的 hashCode 方法;
- 两个对象的 hash 值相等,并不一定表示两个对象相同。
String 类的 hashCode() 方法的代码如下:
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
关于乘子 31 大致总结一下:
- 31 是一个质数,与质数相乘得到的结果比其他方式更容易产生唯一性,产生 hash 值重复的概率比较小,冲突概率小
- Java 中如果相乘的数字太大会导致内存溢出问题,从而导致数据丢失。