Java理论与实践:哈希 - 编程入门网
}
我们应如何编写该类的equals()的方法?这种方法适用于许多情况:
现在我们定义了equals(),我们必须以统一的方法来定义hashCode()。一种 统一但并不总是有效的定义hashCode()的方法如下: public int hashCode() { return 0; } 这种方法将生成大量的条目并显著降低HashMaps的性能,但它符合规范。一 个更合理的hashCode()实施应该是这样:
注意:这两种实施都降低了类状态字段的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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |