Java记录 -57- Object的equals、hashcode和toString方法

Object的hashCode方法是最基础的,equals和toString方法都间接的使用了hashCode方法。

一般情况下,我们在重写一个类的equals方法时,都会连带重写hashCode方法。IDE工具eclipse给我们提供了快捷的重写equals和hashCode的方法,而不是其中一个,更说明了这个两个方法一般都会一块进行重写。

Object的equals方法:

public boolean equals(Object obj) {
    return (this == obj);
}

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 x,x.equals(null) 都应返回 false。

Object的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

Object的hashCode方法

public int hashCode()

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,如果没有修改对象进行
    equals 比较时所用的信息,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用
    hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。

Object的toString

public String toString()

返回该对象的字符串表示。通常toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at
标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + ‘@‘ + Integer.toHexString(hashCode())
时间: 2024-10-12 23:21:54

Java记录 -57- Object的equals、hashcode和toString方法的相关文章

Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用

以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类Manager ,验证在类继承过程中equals().hashcode().toString()方法的使用.package equals;public class EqualsTest{    public static void main(String[] args){        Employ

java笔记--关于Object类与线程相关的方法

关于Object类中的线程方法 Object类是所有Java类的 父类,在该类中定义了三个与线程操作有关的方法,使得所有的Java类在创建之后就支持多线程 这三个方法是:notify(),notifyAll(),wait(),这几个方法都是用来控制线程的运行状态的. 方法列表如下: notify() : 唤醒在此对象监视器上等待的单个线程 notifyAll() : 唤醒在此对象监视器上等待的所有线程 wait() : 在其他线程时调用此对象的notify()或者notifyAll()方法前,导

java中equals与hashCode还有tostring方法学习记录

package javas.fristdome01; import org.testng.annotations.Test; class Person { private String name; private int age; Person() { } Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void s

Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?

Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来提高对HashMap.Hashtable哈希表存取对象的使用效率. 关于Object对象的hashCode()返回值,网上对它就是一个简单的描述:"JVM根据某种策略生成的",那么这种策略到底是什么呢?我有一个毛病,遇到这种含糊其辞的东西,就想探个究竟,所以,本文就将hashCode()本

java基础:Object的equals方法

一:看第一个例子 输出结果: false false cat1 == cat2 很简单,他们不是同一对象,有不通的存储地址. 但是cat1.equals(cat2)为什么是false呢.因为cat是对象,这里用的是父类的equals方法 而Object类equals方法的实现为: <strong><span style="font-size:18px;"> public boolean equals(Object obj) { return (this == o

Java功底篇系列-01-从==/equals/hashCode开始

前言 自己毕业后做JAVA开发已经2年了,从最初的JAVA WEB开发,到投入到Hadoop大数据开发潮流中,越来越发现自己的JAVA基础,数据结构,多线程等等,是那么的脆弱!还有什么比基础更加重要呢,应该静下心来,去学习它们,就从这一篇博客开始吧~ 话题一:==与equals 让我们首先看看Object类中定义的equals方法的源码: 在Object类中,equals就是利用==实现对象之间的比较的. 我们知道对于基本数据类型,==比较的就是他们的值是否相等,那么对于对象类型的==比较的是什

java常用类 --- Object

Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: notify().notifyAll().wait().wait(long timeout).wait(long timeout,int nanos),  这些方法等介绍线程时在做解释. 下面来看看其他方法: (1)equals(Object obj)方法功能: Object类定义的equals方法用

Java基础之Object

Object是所有类的最终祖先.,可以使用Object类引用任何类型的对象.在Java中,只有基本类型不是对象. Equals方法 Object类中的equals方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用. 但是,我们一般意义上的相等不仅仅是具有相同的引用,如果另个对象的状态相等,就认为另个对象是相等的.所以,子类要重写超级类中的equals方法. Java中,要求equals方法具有下面的特性: 自反性,x.equals(x)返回tu

JAVA toString方法

在JAVA中,所有的对象都有toString方法: 创建类时没有定义toString方法,输出对象时,会输出对象的哈希值: 它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法 它通常只是为了方便输出: 例如: public class Test2{ String name; int age; public String toString(){ return "我的姓名是:"+name+"\t我的年龄是:"+age; } public s