Java中的hashCode()方法的深入剖析
我们知道在Object类中的成员方中有个生成散列码的方法
public int hashCode()
他是用来生成散列码的
1、我们首先分析一下哈希表的原理
比如:HashMap<String , Integer> hs =
new HashMap<String , Integer>();
String str = “qwe” ;
Integer value = 23 ;
hs.put(str,value);
那么在内存中关键字(str)和存储值(value)是怎样存储的呢?如下:

这样就将Key 与 Value 之间生成一种映射关系
2、这个hashCode()方法非常有用,在所有的与Hash字眼相关的类(姑且称为hash类)中,这个方法是非常重要的,而且这些hash类几乎都必须重写这个方法,以便是该类能够正常运行
3、首先在Object类中的hashCode(),在没有经过重写之前,他是根据实例对象的存储地址来生成散列码的
4、但是很多情况下(几乎所有实际情况下),我们根据对象的存储地址生成散列码是不能够达到预期目的的,我们往往是想根据实例对象的内容来生成散列码,比如如果两个实例对象的内容一模一样,但是存储地址不一样,我们还是想为他们生成相同的散列码,比如在HashSet、HashMap等类中
这时我们就要自己重写这个hasCode方法了;
(需要注意的是一些常用的类如String类、基本数据类型的包装类等已经重写了这个方法,确保了如下的实现规则:
只要当两个对象的内容一致时,那么通过hashCode()生成的散列码是一样的)
5、一个好的散列函数是非常难于确定的,那么当为一个类重写该方法时,应该怎样写呢?在《Thinking in java》
一书当中17.9.3 覆盖hasCode()一节当中有非常详细的介绍,先摘录一部分
hashCode()用来生成散列码的类的内部的属性,必须是equals()用来判定两对象相等的属性,因为如果对象不相等的话,一般要具有不同的散列码




当然最简单的一种方法就是直接利用String类型的成员域来生成散列码,即在当前的元素类中加入一个String类型的成员域,专门用这个字符串对象生成该元素类的散列码,当然必须保证每个元素对象的这个String类型的成员域应该有不同的内容,这样就可以在元素类中的hashCode()方法中直接返回 return str.hashCode();这样是很简单的,但是这有时难以做到的,不太稳定

浙公网安备 33010602011771号