Java 为什么hashCode()和equals()都存在
为什么java对象类有两个方法hashcode()和equals()?其中一个看起来是多余的,它被过滤到最底层的派生类?等于比较对象,哈希代码用于从对象生成哈希值,然后由java映射容器(哈希表、映射等)使用Java 为什么hashCode()和equals()都存在,java,Java,为什么java对象类有两个方法hashcode()和equals()?其中一个看起来是多余的,它被过滤到最底层的派生类?等于比较对象,哈希代码用于从对象生成哈希值,然后由java映射容器(哈希表、映射等)使用 通常会一起重写它们(如果重写hashcode,则需要重写equals,反之亦然)。首先,重写equals()时,还必须重写hashcode() 不这样做 将导致违反Object.hashCode的通用合同,这将 阻止类与所有基于哈希的 集合,包括HashMap、HashSet和Hashta
通常会一起重写它们(如果重写hashcode,则需要重写equals,反之亦然)。首先,重写equals()时,还必须重写hashcode() 不这样做 将导致违反Object.hashCode的通用合同,这将 阻止类与所有基于哈希的 集合,包括HashMap、HashSet和Hashtable 这是从对象规范[JavaSE6]复制的合同:
- 在执行过程中多次在同一对象上调用- 对于应用程序,hashCode方法必须一致地返回 相同的整数,但未提供在 对象被修改。此整数不需要从一个execu保持一致- 将一个应用程序转换为同一应用程序的另一个执行
- 如果根据equals(Object)方法,两个对象相等,则调用- 对两个对象中的每个对象使用hashCode方法必须产生相同的结果 整数结果李>
- 根据equals(Object)方法,如果两个对象不相等,则不需要对这两个对象中的每一个调用hashCode方法 必须生成不同的整数结果。然而,程序员应该是 请注意,为不相等的对象生成不同的整数结果可能会提高 哈希表的性能
是“给我一些有效的方法,看看两个对象是否可能相等”hashCode
是“检查此对象是否真正等于另一个对象”equals
- 为什么你认为一个是多余的?他们说了不同的话:
为了高效地查找哈希表,您绝对需要哈希代码,而且您绝对需要进一步的相等性检查,因为哈希会发生冲突(例如,可能的字符串远多于哈希代码)。基本思想是通过比较
hashcode()
s快速检查两个对象是否可能相等。如果它们的哈希代码相等,那么对象可能相等(不一定,但这是一个很好的猜测)。然后使用equals()
执行更深入(更昂贵)的检查。这对于加快所有类型的查找(从地图等)非常重要。@Neeraj:hashCode可能会发生冲突,即具有相同hashCode的对象并不总是相同的。这是不适用的。两个完全不同的对象可以具有相同的哈希代码。想象一下,hashcode的最大值为Integer.max_value
,而从理论上讲,您可以创建无限多的不同对象。您至少可以尝试阅读API--Javadoc for Object.hashcode()显式地说:“支持此方法是因为有了java.util.Hashtable提供的哈希表。”“我不认为它们真的应该在Object中。”你是说它们都在Object中,还是仅仅是hashCode()?equals()作为检查标识的最终方法(可能命名不同以避免混淆)在我看来是正确的。equals()但是,作为检查相等性的虚拟方法,它似乎位于错误的位置。@Martinho:两者都有。引用标识可以用==进行检查……但是大多数类型实际上没有“相等”的概念或者基于数据的合理散列-那么为什么要为所有对象发布它们呢?当然,这篇博文有更多的细节:)另外,因为hashCode是一个int,所以它可以通过充当随机访问的索引来加快查找速度。。