为什么要重写hashcode方法

我看老师新建类的时候比如student类这样总是要重写hashcode和equals方法,但是他说还不重写也行,没搞懂

5个回答

如果该类需要使用HashSet或者HashMap等集合存储时,需要重写。引用哈希散列算法会先根据哈希值验证是否一样,如果一样再调用equals

主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。

如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

参考:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

下面的两个方法来自:java.lang.Object 类.

 equals

public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable


// hashCode------------------------------------------------

hashCode

public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:
此对象的一个哈希码值。
另请参见:
equals(java.lang.Object), Hashtable

qq_39632416
yunyuntop 重写之前hashcode是地址转化的,重写之后是对象内容转化的吗,那比较两个对象的时候岂不是比较hashcode就可以了,要equals干啥
大约 2 年之前 回复
dcxy0
Q544471255 jdk1.6的文档,稍微有点老.不过还可以凑合看一下.
大约 2 年之前 回复

两个对象a.equals(b)中,equals判断是否相同,hashCode相当于对象索引,索引相同会放在同一个链表中,效率会变差。如果你不需要判断两个对象相等,可以不写。或者不需要hashcode,可以自己写个方法:
public boolean isEquals(Student stu){
if(stu.getId()==getId)
return true;
return false;
}

equals对象做比较,hashCode计算int值并返回,你们老师老是要重写是因为:所有类默认继承父类Object,想比较想计算值,就按照父类的规范重写,这个叫主流
如果你们在教学阶段,那倒不必重写,因为仅仅是学习,没必要没创建一个类就重写又不是做项目做例题,额,你们老师没将清楚把,

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!