equals和HashCode 修改一致?

来源:互联网 发布:在线注音软件 编辑:程序博客网 时间:2024/06/05 03:18
1.Object类的public boolean equals(Object obj)方法是通过 return this == obj;这种方式比较两个对象是否相同。这里比较的是引用。
2.Object类的public int hashCode()方法,是通过该实例地址转换为int值。所以不同的Object实例在同一运行期hashCode一定不相同。

以上两点是针对Object类本身说的,但是不同的子类会重写这两个方法,满足他们各自的比较特性,比如众所周知的String中equals()方法就是比较内容,而不是比较this == obj。相同的,String对象的hashCode也不是内存地址的反应,而是通过对String的value计算得到一个int值来做hashCode()结果。

所以每个类都可以分别将equals和hashCode两个方法重写。但是一般都是一起重写,使其基于同样的比较方法,就像上面String那样。这是出于一种协定,因为很多情况下,从提高效率角度出发,比较两个对象时候,hashCode会优先于equals方法,这个可以看JDK源代码中HashMap的put(K,V)方法。源码中,首先比较K的hashCode然后再比较equals。说明JDK协定:如果hashCode不相同,那么两个对象一定不相同;如果hashCode相同,那么两个对象还得通过equals来比较(另外hibernate里面好像也有类似的机制来比较Entity Bean,但是说实话我不太了解详细情况,这里不敢多讲哈)。我想,这恐怕就是指导大家每次同时重写两个方法的原则吧。

最后多余一句,昨天被花旗面试就问到这个问题,问是不是重写了equals,就一定要再重写hashCode,我怎么回答,现在都不知道。为什么每次都在电话里面被这样的问题闷住 - -||||
0 0
原创粉丝点击