探究toString()、equals()、hashCode()

探究toString()equals()hashCode()

1、这里我们先对@override做一下了解吧

· @ 这个符号称为Java的注解。Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。

·Java @Override 注解是用来指定方法重写的,只能修饰方法并且只能用于方 法重写,不能修饰其它的元素。

那什么又是重写呢?

Override (被称为重写或覆盖):子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。

后面以这几个方法来具体了解重写的相关内容。

 

先放个测试代码:

 1 package demo;
 2 
 3 //OverrideText.java
 4 
 5 import java.util.Objects;
 6 
 7 public class OverrideText {
 8     public static void main(String[] args)    {
 9         Person p1 = new Person("张三");
10         Person p2 = new Person("张三");
11         System.out.println(p1.toString());
12         System.out.println(p2.toString());
13         System.out.println(p1.equals(p2));
14         System.out.println(p1.hashCode()+"   "+p2.hashCode());
15     }
16 
17 }
18 
19 class Person {
20     private String name;
21 
22     public Person() {
23     }
24 
25     public Person(String name) {
26         this.name = name;
27     }
28 
29     public String getName() {
30         return name;
31     }
32 
33     public void setName(String name) {
34         this.name = name;
35     }
36 
37     @Override
38     public String toString() {
39         return "Person{" +
40                 "name='" + name + '\'' +
41                 '}';
42     }
43 
44     @Override
45     public boolean equals(Object o) {
46         if (this == o) return true;
47         if (o == null || getClass() != o.getClass()) return false;
48         Person person = (Person) o;
49         return Objects.equals(name, person.name);
50     }
51 
52     @Override
53     public int hashCode() {
54         return Objects.hash(name);
55     }
56 }
Test Code

 

2、toString()方法

调用测试代码

·未重写toString()时,得到的结果如下:

demo.Person@16b98e56

demo.Person@7ef20235

·重写toString()时,得到的结果如下:

Person{name='张三'}

Person{name='张三'}

(tips:得到的结果根据每个人重写的内容不同而不同,我这里是直接调用IDEA里的快捷方式得到的重写后的代码,equals()hashCode()也是如此。)

从测试看,未重写的得到的结果是给电脑本身看的,测试电脑不同得到的结果会不同,而不是给我们看的,原因是我们没有覆写ObjecttoString()方法,覆写之后就可以得到我们需要的输出。

3、equals()方法

调用未重写的代码得到的是false,重写后得到的是true

未重写的equals()相当于==,直接比较的是对象的地址,因为是两个对象所以地址肯定是不同的,返回的是false,也确实是这样。当我们重写后,我们需要比较的是对象的内容,对象的内容是相同的,所以返回的是true

4、hashCode()方法

首先得到未重写hashCode()得到的哈希值:

793589513   1313922862

之后测试得到重写方法后得到的哈希值:

774920   774920

可以看出,未重写方法得到了两个对象两个不同的哈希值,而重写后的hashCode()方法得到的是相同的哈希值。

 

覆写Object类中的equals()hashCode()方法的理解:

这种做法一般是为了增强自定义类的扩展性,尤其是当该类的对象要存入HashSet集合时,覆写这两个方法尤为重要。覆写equals()方法之后,可以实现对象的自定义比较,覆写hashCode()方法,可以根据对象属性的不同,返回相应的哈希值。

具体到HashSet集合中对这两个方法的调用步骤,如下:

1)当向集合中存入一个元素时,会调用该元素的hashCode()方法,得到该对象哈希值,如果集合中已有元素的哈希值和该元素的哈希值不重复,该元素被存入集合。

2)如果要存入元素的哈希值和已有元素的哈希值相同,会进一步调用equals()方法,比较这两个元素是否相同,如果不同,该元素依然会被存入集合,如果相同,则认为这两个元素相同,由于集HashSet集合中不能存入相同元素,所以存储动作不会成功。

关于HashSet集合中hashCodeequals方法更详尽的理解可自行查找(推荐文章:https://cloud.tencent.com/developer/article/1550601

 

以上是我关于toString()equals()hashCode()的测试与理解,其中不足的地方,望各位大佬能批评指正。

 

 

参考文章:https://blog.csdn.net/baidu_36640811/article/details/79384026

 

posted @ 2022-08-14 15:28  FREAM  阅读(92)  评论(0)    收藏  举报