`
hanwn123
  • 浏览: 24159 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

override的equals与hashCode方法

阅读更多

如果你为某个类写了equals方法,那么应该同时编写hashCode方法.
如果没有提供hashcode方法,编译器不会报错,而且也可能不会遇到任何问题.但是将对象插入到基于冲突的哈希表(类java.util.Set也使用同样的哈希表实现)可能导致不可预料的后果.解决产生的问题,可能要花费大量的时间.所以一定要养成这样的习惯:如果编写了方法equals,同时也提供相应的hashcode方法


equals():
它是用于进行两个对象的比较的,是对象内容的比较。
对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
    * 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
    * 反射性:x.equals(x)必须返回是“true”。
    * 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
    * 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
    * 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

 

hashCode():
这个函数返回的就是一个用来进行哈希操作的整型代号,请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。前者不仅仅是个代号还具有在内存中才查找对象的位置的功能。

hashCode()所返回的值是用来分类对象在一些特定的Collection对象中的位置。这些对象是HashMap, Hashtable, HashSet,等等。这个函数和上面的equals()函数必须自己设计,用来协助HashMap, Hashtable, HashSet,等等对自己所收集的大量对象进行搜寻和定位。

这些Collection对象究竟如何工作的,想象每个元对象hashCode是一个箱子的编码,按照编码,每个元对象就是根据hashCode()提供的代号归入相应的箱子里。所有的箱子加起来就是一个HashSet,HashMap,或 Hashtable对象,我们需要寻找一个元对象时,先看它的代码,就是hashCode()返回的整型值,这样我们找到它所在的箱子,然后在箱子里,每个元对象都拿出来一个个和我们要找的对象进行对比,如果两个对象的内容相等,我们的搜寻也就结束。这种操作需要两个重要的信息,一是对象的 hashCode(),还有一个是对象内容对比的结果。

 

hashCode()的返回值和equals()的关系如下:

    * 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
    * 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。因为不

同的对象返回相同的哈希值,也就是冲突。

 

为什么这两个规则是这样的,原因其实很简单,拿HashSet来说吧,HashSet可以拥有一个或更多的箱子,在同一个箱子中可以有一个或更多的独特元对象(HashSet所容纳的必须是独特的元对象)。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。


当一个对象类型作为Collection型对象的元对象时,这个对象应该拥有自己处理equals(),或处理hashCode()的设计,而且要遵守前面所说的两种原则。equals()先要查null和是否是同一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查 null是为了避免出现NullPointerException这样的异常给丢出来。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pengchua/archive/2008/04/16/2297547.aspx

分享到:
评论

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    java中hashcode()和equals()方法详解

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...

    学习Object类——为什么要重写equeals和hashcode方法

    此外,Object 类的设计是为了扩展,它提供了一些非 final 方法,如 equals、hashCode、toString、clone 和 finalize,这些方法都有通用的约定,需要在子类中被覆盖(override)。如果不遵守这些约定,依赖这些约定的...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    重写hashCode()和equals()方法详细介绍

    在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...

    hashcode和equals的分析

    ### hashCode和equals方法详解 #### 一、hashCode方法解析 在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合...

    hashcode()和equals()

    在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 或 `HashSet`)时。这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类...

    重写equals方法

    第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...

    java中hashCode、equals的使用方法教程

    `hashCode()`的返回值应该与`equals()`方法保持一致关系。如果两个对象根据`equals()`方法比较是相等的,那么它们的`hashCode()`也应该相等。反之,如果`equals()`返回`false`,`hashCode()`则可以相等也可以不等。...

    详解hashCode()和equals()的本质区别和联系

    在 Java 中,hashCode() 和 equals() 是两个非常重要的方法,它们都是从 Object 类继承来的。了解这两个方法的本质区别和联系对于 Java 开发者来说至关重要。 equals() 方法 equals() 方法是 Object 类提供的一种...

    java中hashcode()和equals()的详解

    `hashCode()`方法则与`equals()`密切相关,它返回一个整数值,代表对象的哈希码,这个值是基于对象的特定状态计算出来的。在哈希表中,对象通过其哈希码快速定位。如果两个对象根据`equals()`方法判断相等,那么它们...

    如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写

    在Java编程中,`equals()`和`hashCode()`方法是Object类中的两个重要方法。当我们创建自定义类并将其对象放入集合(如HashSet)时,往往需要重写这两个方法以确保集合能够正确地处理这些对象。IntelliJ IDEA,作为一...

    C# Equals 和 GetHashCode 方法重写

    ### C# Equals 和 GetHashCode 方法重写 在C#编程中,`Equals` 和 `GetHashCode` 方法是非常重要的成员方法,它们对于确保对象的正确比较以及高效地存储和检索对象至关重要。这两个方法通常需要在自定义类中进行...

    java中List对象列表实现去重或取出及排序的方法

    equals方法用于比较两个对象是否相同,而hashCode方法用于计算对象的哈希码值。 例如,假设我们有一个Student类,想要去重Student对象列表。首先,我们需要重写Student类的equals和hashCode方法。 ```java public ...

    hashcode与eqault比较

    ### hashCode与equals方法详解 在Java编程语言中,`hashCode`和`equals`方法是非常重要的概念,它们在处理对象的比较、存储以及检索时扮演着关键角色。本文将深入探讨这两个方法之间的区别,并通过具体例子来说明...

Global site tag (gtag.js) - Google Analytics