快速业务通道

Java理论与实践:哈希 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

Java理论与实践:哈希

时间:2010-12-20 IBM Brian Goetz

每个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对象的一个实例。不用说,这种方法极不方便而且错误频频。

Object的interface contract要求如果根据 equals()两个对象是相等的,那 么它们必须有相同的hashCode()值。当其识别能力整个包含在equals()中时,为 什么我们的根对象类需要hashCode()?hashCode()方法纯粹用于提高效率。Java 平台设计人员预计到了典型Java应用程序中基于散列的集合类(Collection Class)的重要性--如Hashtable、HashMap和HashSet,并且使用equals()与许多 对象进行比较在计算

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号