为什么一个好的类需要覆写toString()、hashCode()、equals()方法

第一:覆写Object类中的toString方法
public class Client {  
     public static void main(String[] args) {  
        System.out.println(new Person("张三"));  
     }  
}  
 
class Person{  
     private String name;  
 
     public Person(String name){  
          this.name=name;  
     }      
} 

输出的结果是:Person@3ce53108。如果机器不同,@后面的内容也不会相同,但是格式都是:类名+@+hashCode。

这是给机器看的,不是给我们看的,原因是我们没有覆写Object类的toString()方法,覆写之后就可以得到我们需要的输出。

第二:覆写Object类中的hashCode()、equals()方法

这种做法一般是为了增强自定义类的扩展性,尤其是当该类的对象要存入HashSet集合时,覆写这两个方法尤为重要。覆写equals方法之后,可以实现对象的自定义比较,如果不覆写此方法,默认调用Object的equals方法,等同于比较地址值。如果一个类不覆写Object中的hashCode方法,而直接调用该方法,得到的哈希值是由系统计算出的,返回值和对象属性之间没有直接联系。覆写hashCode方法,可以根据对象属性的不同,返回相应的哈希值。
具体到HashSet集合中对这两个方法的调用步骤,如下:
1)当向集合中存入一个元素时,会调用该元素的hashCode方法,得到该对象哈希值,如果集合中已有元素的哈希值和该元素的哈希值不重复,该元素被存入集合。
2)如果要存入元素的哈希值和已有元素的哈希值相同,会进一步调用equals方法,比较这两个元素是否相同,如果不同,该元素依然会被存入集合,如果相同,则认为这两个元素相同,由于集HashSet集合中不能存入相同元素,所以存储动作不会成功。
需要说明的是:覆写这两个方法并非必须。如果只是编写一个用于测试的简单类,完全没有必要一定覆写这两个方法。只是一般开发中考虑到程序的扩展性,或者该类对象有可能被存储到HashSet中,覆写这两个方法可以为以后程序的升级提供方便。当然,一个好的类,一般会覆写Object中的equals方法、hashCode方法、toString方法等。


没有更多推荐了,返回首页