toString()、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进制),

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我明白了。下面是题目所要求的代码,您可以参考一下: ```java import java.util.Date; public class Student implements Comparable<Student> { private String name; private Date birthday; private int id; private String school; public Student(String name, Date birthday, int id, String school) { this.name = name; this.birthday = birthday; this.id = id; this.school = school; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", birthday=" + birthday + ", id=" + id + ", school='" + school + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Student)) return false; Student student = (Student) o; if (id != student.id) return false; if (!name.equals(student.name)) return false; if (!birthday.equals(student.birthday)) return false; return school.equals(student.school); } @Override public int hashCode() { int result = name.hashCode(); result = 31 * result + birthday.hashCode(); result = 31 * result + id; result = 31 * result + school.hashCode(); return result; } @Override public int compareTo(Student o) { return this.id - o.id; } } ``` 这是一个完整的符合要求的代码,其中包括了定义了一个学生类,成员变量包括:姓名,生日,学号,学校;重写了方法toStringequalshashCode;实现了接口Comparable,按照学号大小进行比较;定义构造方法。如果您对其中的实现细节不太理解,可以在回复中向我提问,我会尽力给您解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值