快速业务通道

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

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

我们应如何编写该类的equals()的方法?这种方法适用于许多情况:

public boolean equals(Object other) { // Not strictly necessary, but often a good optimization if (this == other) return true; if (!(other instanceof A)) return false; A otherA = (A) other; return (someNonNullField.equals(otherA.someNonNullField)) && ((someOtherField == null) ? otherA.someOtherField == null : someOtherField.equals(otherA.someOtherField))); }

现在我们定义了equals(),我们必须以统一的方法来定义hashCode()。一种 统一但并不总是有效的定义hashCode()的方法如下:

public int hashCode() { return 0; }

这种方法将生成大量的条目并显著降低HashMaps的性能,但它符合规范。一 个更合理的hashCode()实施应该是这样:

public int hashCode() { int hash = 1; hash = hash * 31 + someNonNullField.hashCode(); hash = hash * 31 + (someOtherField == null ? 0 : someOtherField.hashCode()); return hash; }

注意:这两种实施都降低了类状态字段的equals()或hashCode()方法一定比 例的计算能力。根据您使用的类,您可能希望降低superclass的equals()或 hashCode()功能一部分计算能力。对于原始字段来说,在相关的封装类中有 helper功能,可以帮助创建散列值,如Float.floatToIntBits。

编写一个完美的equals()方法是不现实的。通常,当扩展一个自身忽略了 equals()的instantiable类时,忽略equals()是不切实际的,而且编写将被忽略 的equals()方法(如在抽象类中)不同于为具体类编写equals()方法。关于实例以 及说明的更详细信息请参阅Effective Java Programming Language Guide, Item 7 (参考资料) 。

Java理论与实践:哈希(3)

时间:2010-12-20 IBM Brian Goetz

有待改进?

将散列法构建到Java类库的根对象类中是一种非常明智的设计折衷方法 -- 它使使用基于散列的容器变得如此简单和高效。但是,人们对Java类库中的散列 算法和对象相等性的方法和实施提出了许多批评。java.util中基于散列的容器 非常方便和简便易用,但可能不适用于需要非常高性能的应用程序。虽然其中大 部分将不会改变,但当您设计严重依赖于基于散列的容器效率的应用程序时必须 考虑这些因素,它们包括:

太小的散列范围。使用int而不是long作为hashCode()的返回类型增加了散列 冲突的几率。

糟糕的散列值分配。短strings和小型integers的散列值是它们自己的小整数 ,接近于其它“邻近”对象的散列值。一个循规导矩(Well-behaved)的散列函 数将在该散列范围内更均匀地分配散列值。

无定义的散列操作。虽然某些类,如String和List,定义了将其Element的散 列值结合到一个散列值中使用的散列算法,但语言规范不定义将多个对象的散列 值结合到新散列值中的任何批准的方法。我们在前面编写自己的equals()和 hashCode()方法中讨论的List、String或实例类A使用的诀窍都很简单,但算术 上还远远不够完美。类库不提供任何散列算法的方便实施,它可以简化更先进的 hashCode()实施的创建。

当扩展已经忽略了equals()的 instantiable类时很难编写equals()。当扩展 已经忽略了equals()的 instantiable类时,定义equals()的“显而易见的”方 式都不能满足equals()方法的对称或传递性需求。这意味着当忽略equals()时, 您必须了解您正在扩展的类的结构和实施详细信息,甚至需要暴露基本类中的机 密字段,它违反了面向对象的设计的原则。

结束语

通过统一定义equals()和hashCode(),您可以提升类作为基于散列的集合中 的关键字的使用性。有两种方法来定义对象的相等性和散列值:基于标识,它是 Object提供的缺省

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号