导航
我们为什么需要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进制),所以直接打印出来的并不是地址,而是与地址相关的一串字符串。
所以我们想在打印是输出我们想要的数据&#x