Object的equals()及hashCode()(
来源:互联网 发布:java把字符串变成集合 编辑:程序博客网 时间:2024/05/16 08:37
在某些时候,我们需要判断两个对象是否相等。Java的每个类都继承于Object类。它使用equals()及hashCode()这两个方法来判断两个Object是否相等。
1.
对于非null的对象引用,依下面关系进行判断:
l
l
l
l
l
Object的默认实现是只有在两个Object的引用相等时,才会返回true,即return x == y;
如果要覆盖(override)此方法,需要同时覆盖hasCode(),要求是:两个相等的对象必须有相等的hash code。
2.
其必须遵循的约定是:
l
l
l
作为常理,不相等的对象的hasCode()应可能地返回不同的int值。(通常可以将对象的内存地址转换为int值后返回,但这不是Java语言所要求的)。
3.
l
l
l
这样,只要符合上面3点条件,采用何种公式或方式来实现hasCode()均是可行的。
4.
尽管道理很浅显,但要实现起来并不容易,尤其是hashCode()。考虑一下两个对象,如果它们的一个String的字段相等就可认为两个对象相等。这种情况下,应如何根据这个String的字段来返回相同或不同的int值?相等时很好办,用以下的语句即可解决:
if (strA.equals(strB)) {
}
但不等时呢,难点在于如何将不等的String值转换为不同的int值。而且,如果这两个对象均出自同一类,您所编写的代码均适用于这两个对象,同样的代码,如何才能出现不同的结果?如果通过硬编码的方式,先取得另一个对象的hashCode()值,再依此修改本对象的hasCode()值,势必造成每次比较都会导致本身的hasCode()值频繁发生变化。而如果同一类的不同实例使用各自的算法,从而无需提取另一个对象的hashCode()值,但在比较时,又如何实时地了解对方的情况?我们陷入了两难的境地。
好消息是,jakarta-commons中一个lang包,其EqualsBuilder与HashCodeBuilder类可方便地解决此问题。对于equals()及hashCode(),均有硬编码及反射机制的两种解决方法。
EqualsBuilder
先看码编码方式:
public boolean equals(Object obj) {
在进行基本的判断后,通过EqualsBulder.append()的方式,将用于区分两个对象的各个业务关键逻辑逐一增加至其实例中就可以了。
下面是反射机制:
public boolean equals(Object obj) {
}
代码更简洁。
HashCodeBuilder
先看硬编码方式:
public class Person {
}
这里,name, age, smoker等字段均为在equals()中使用的信息。任选两个随意的非零奇数作为构造函数的参数,并逐一加至HashCodeBuilder的实例中。
再看反射机制:
public int hashCode() {
}
同样也很简单。
尽管通过反映机制看起来比较简单,但一是速度较慢,二是要受到安全机制的制约,因此,应尽可能地使用硬编码的方式。
转自:http://blog.chinaunix.net/u1/33099/showart_269142.html
- Object的equals()及hashCode()(
- 关于Object的equals()及hashCode()
- 关于Object的equals()及hashCode()
- Object类的解释(equals,hashcode)
- Object中 hashCode ---equals的完全理解
- Object 的俩个方法:equals() hashcode()
- Object类:hashCode() 与 equals() 的关系
- Object对象的通用方法-equals、hashCode
- 关于Object类的equals()和hashcode()
- Object的hashCode方法和equals方法
- Object的equals和hashCode方法
- Java Object equals() & hashCode()
- Java object equals hashcode
- Java中Object的使用:重载equals、hashCode及实现compareTo
- Object常用方法介绍及注意事项equals(),hashCode(),getClass(),toString()
- equals与hashCode的区别及联系
- Object 类 equals toString hashCode
- Object与equals与HashCode
- ComboBox javafx api
- 防止表单重复提交 PHP Token(令牌)设计
- 无限互联iOS视频教程及课件PPT源码--献给初学者
- VS2010版快捷键
- [bxd学习java基本点]3.集合的共性方法,迭代器取数据二法,注意其正规写法。
- Object的equals()及hashCode()(
- (译)如何使用CCRenderTexture来创建动态纹理
- android编程中遇到的关于Error parsing XML: unbound prefix错误的原因及解决办法
- Codeforces Beta Round #43 D. Parking Lot
- 网站类产品分析
- Java常用的加密解密类
- win32控制台程序中使用CString和string
- jdbc sqlserver 分页
- 卡特兰数