探究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 }
2、toString()方法
调用测试代码
·未重写toString()时,得到的结果如下:
demo.Person@16b98e56
demo.Person@7ef20235
·重写toString()时,得到的结果如下:
Person{name='张三'}
Person{name='张三'}
(tips:得到的结果根据每个人重写的内容不同而不同,我这里是直接调用IDEA里的快捷方式得到的重写后的代码,equals()、hashCode()也是如此。)
从测试看,未重写的得到的结果是给电脑本身看的,测试电脑不同得到的结果会不同,而不是给我们看的,原因是我们没有覆写Object类的toString()方法,覆写之后就可以得到我们需要的输出。
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集合中hashCode及equals方法更详尽的理解可自行查找(推荐文章:https://cloud.tencent.com/developer/article/1550601)
以上是我关于toString()、equals()、hashCode()的测试与理解,其中不足的地方,望各位大佬能批评指正。
参考文章:https://blog.csdn.net/baidu_36640811/article/details/79384026

浙公网安备 33010602011771号