Object - hashCode
public native int hashCode();
- hashCode()返回该对象的哈希码值(也叫散列码)
- hashCode()主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable..
问题点 & 应用场景
- 当一个不可重复的对象集合进行添加时,新增的对象要与使用集合内的所有对象进行地址equals()比较,
当集合的数据量较为庞大时,就会很影响效率,此时时间复杂度为O(n)
- 给每个对象生成对应的Hash值,把所有已经存在的元素的Hash值保存到一张table里,
当我们添加新的元素的时候,给对应元素生成对应的Hash值,然后再对比table里所有的Hash对比,不存在则新增,存在则不添加
equals 和 hashcode 的关系(规则)
- 如果equals为true,hashcode一定相等
- 如果equals为false,hashcode不一定不相等
- 如果hashcode值相等,equals不一定相等
- 如果hashcode值不等,equals一定不等
重写equals方法时,一定要重写hashcode方法
TestModel model = new TestModel("小花狗")
TestModel model2 = new TestModel("小花狗")
- 上述当重写equals方法后,判断对象为true,但其hashcode却不一致
(因为hashCode是获取对象的内存地址后再去进行hash算法的),这样就会违反规则。
String - hashCode
public int hashCode() {
int h = hash
if (h == 0 && value.length > 0) {
char val[] = value
for (int i = 0
h = 31 * h + val[i]
}
hash = h
}
return h
}
- hashCode计算方式: 循环遍历相加每隔字符*31