有效和正确定义hashCode()和equals()
日期:2007年5月19日 作者: 查看:[大字体 中字体 小字体]-
有效和正确定义hashCode()和equals()
级别:入门级
Brian Goetz (brian@quiotix.com)
Quiotix Corp首席顾问
2003 年 8 月
每个Java对象都有hashCode()和 equals()方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义hashCode()和equals()时应遵循的规则和指南。您可以在讨论论坛与作者和其它读者一同探讨您对本文的看法。(您还可以点击本文顶部或底部的讨论进入论坛。)
虽然Java语言不直接支持关联数组 -- 可以使用任何对象作为一个索引的数组 -- 但在根Object类中使用hashCode()方法明确表示期望广泛使用HashMap(及其前辈Hashtable)。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式中支持散列可以促进基于散列的容器的开发和使用。
定义对象的相等性
Object类有两种方法来推断对象的标识:equals()和hashCode()。一般来说,如果您忽略了其中一种,您必须同时忽略这两种,因为两者之间有必须维持的至关重要的关系。特殊情况是根据equals() 方法,如果两个对象是相等的,它们必须有相同的hashCode()值(尽管这通常不是真的)。
特定类的equals()的语义在Implementer的左侧定义;定义对特定类来说equals()意味着什么是其设计工作的一部分。Object提供的缺省实施简单引用下面等式:
public boolean equals(Object obj) { return (this == obj); }
在这种缺省实施情况下,只有它们引用真正同一个对象时这两个引用才是相等的。同样,Object提供的hashCode()的缺省实施通过将对象的内存地址对映于一个整数值来生成。由于在某些架构上,地址空间大于int值的范围,两个不同的对象有相同的hashCode()是可能的。如果您忽略了hashCode(),您仍旧可以使用System.identityHashCode()方法来接入这类缺省值。
忽略 equals() -- 简单实例
缺省情况下,equals()和hashCode()基于标识的实施是合理的,但对于某些类来说,它们希望放宽等式的定义。例如,Integer类定义equals() 与下面类似:
public boolean equals(Object obj) {
return (obj instanceof Integer
&& intValue() == ((Integer) obj).intValue());
}
在这个定义中,只有在包含相同的整数值的情况下这两个Integer对象是相等的。结合将不可修改的Integer,这使得使用Integer作为HashMap中的关键字是切实可行的。这种基于值的Equal方法可以由Java类库中的所有原始封装类使用,如Integer、Float、Character和Boolean以及String(如果两个String对象包含相同顺序的字符,那它们是相等的)。由于这些类都是不可修改的并且可以实施hashCode()和equals(),它们都可以做为很好的散列关键字。
为什么忽略 equals()和hashCode()?
如果Integer不忽略equals() 和 hashCode()情况又将如何?如果我们从未在HashMap或其它基于散列的集合中使用Integer作为关键字的话,什么也不会发生。但是,如果我们在HashMap中使用这类Integer对象作为关键字,我们将不能够可靠地检索相关的值,除非我们在get()调用中使用与put()调用中极其类似的Integer实例。这要求确保在我们的整个程序中,只能使用对应于特定整数值的Integer对象的一个实例。不用说,这种方法极不方便而且错误频频。 - [1] [2] [3] [4] 下一页
-
- 有效和正确定义hashCode()和equals() 相关文章:
- 有效和正确定义hashCode()和equals() 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:Java连接各种数据库的实例
下一篇:在Java中读写Excel文件
精品推荐
热点TOP10
- ·Java程序员认证模拟题及详细分析(1)
- ·通过Java认证 SCJP 考试之精辟总结
- ·SUN认证Java2程序员考试(SCJP)试题解析
- ·JAVA考试认证:SCJP310-035考试心得
- ·剑桥大学java期末考试题一份
- ·有效和正确定义hashCode()和equals()
- ·Java语言入门(1)
- ·JAVA认证培训辅导:随机整数的生成
- ·学习java&xml心得(2)
- ·Test of the Java Skill(3)
- ·Java认证心得:顺利通过SCJP测试全接触
- ·SUN国际认证考试指定考试考场
- ·Jcreater+MotoJ2SDK的配置与使用心得
- ·sun国际认证考试将在指定考场进行
- ·考试要点分享——SCJP考点总结
- ·开发J2EE应用应遵循的几点原则
- ·java入门学习指导之最佳方向(上)
- ·Java语言入门(2)
- ·该不该去考 Java 认证?
- ·最新Sun授权国内考试中心一览表
