toString()、equals()与hashCode()

本文探讨了Java中toString()、equals()和hashCode()的重要性。默认情况下,对象打印显示的是由hashCode生成的地址,因此需要重写toString()以便在输出时展示有意义的信息。equals()用于判断对象是否相等,而默认行为是基于引用比较。重写equals()以根据业务逻辑判断对象是否相等。hashCode()与equals()密切相关,尽管相同的对象应该有相同的hashCode,但不同对象也可能有相同的hashCode,因此仅凭hashCode不能确定对象是否相等。在重写equals()时,通常也需要重写hashCode()以保持一致性。

我们为什么需要toString()、equals()与hashCode()?

  Java是面向对象的,除了基础数据类型,我们平时更多情况都是跟引用数据类型:类与对象,打交道。而引用数据类型使用起来,没有基础数据类型那么简单方便。比如需要查看“值”的时候,直接打印基础数据类型,就能知道它的值,而应用数据类型,特别是我们自己创建的类与对象,打印出来的则是由hashCode生成的地址。

  所以,为了使应用数据类型打印时可以直观知道它的值,我们需要重写toString()方法。

  在进行比较时,基础数据类型直接通过“ == ”就可以判断。而对于引用数据类型,“ == ”是判断的地址,两个不同的对象,即使里面的值相同,但地址也是不同的。

  所以我们需要重写equals()方法,来根据我们的逻辑判断引用数据类型是否相等。

  而提到equals()方法,就不得不提到hashCode()方法。为什么呢?请看下文:

Object类

  在这里,不得不先提一下Object类,它是Java所有类的父类,不过好在没人给他取别名,没叫它诸如“创始者类”、“盘古类”等。所有的类都默认继承与Object类,所有Object类里的方法,其他类不进行重写也会拥有。这里谈到的toString()、equals()与hashCode()三个方法,都是在Object类里定义的,所以这三个方法是所有类都有的方法。
在这里插入图片描述

toString()

  最低阶的调试方法:使用System.out.println();打印我们想了解的对象,观察它的值来判断。(如何高端得进行调试,我就不展开将了,因为我也只到了debug工具的级别)
  而对于我们自己创建的类,直接打印它的实例化对象时,会发现只能打印出一串字符:

		Student student1 = new Student();
		System.out.println(student1);
-------------------------------------------------------------------
输出结果为:
com.project.test.Student@3c1

  需要知道的时,其实我们在进行打印一个对象时,就是默认调用了它的toString()方法,即System.out.println(student1);等效于System.out.println(student1.toString());。那toString()方法里到底做了什么呢?前往Object类中一探究竟:

	//Object类中源码
    public String toString() {
   
   
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

  如果我们不重写toString()方法,则会返回:类名+@符号+对象的hashCode的16进制数。(Integer.toHexString方法是将数转换为16进制),所以直接打印出来的并不是地址,而是与地址相关的一串字符串。

  所以我们想在打印是输出我们想要的数据,就需要重写该方法:

@Getter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值