關於重寫equals和hashCode

  1. 什麼時候需要重寫equals和hashCode方法

    在比較兩個對象的內容的時候,需要重寫這兩個方法。java系統本身提供的(==)比較方法,有兩種情況:

    1.比較的是基本類型數據,則此時== 跟equals的效果一致,此時比較的是2個值的大小。例如 

    2.比較的是對象的引用,則此時==跟equals比較的是2個引用的內存地址是否一致。

    這裏插入一些對象和對象的引用這個知識點,

    Student stu=new Student("學生A");  語句1

    有人會說,stu就是Student類的實例,就是對象,那麼再看下面

    Student stu;

    stu=new Student("同學B");

    我們都知道對象的創建new Student是在堆棧上創建的,因此stu並不是一個對象,stu是一個對象的引用,他指向new Student("同學B")這個對象


    看到這裏,我們清楚了 當我們在比較2個對象的內容的時候,如果直接用系統默認的equals方法,則會直接比較的2個對象引用是否指向同一個對象(即2個對象的內存地址是否一致),這與我們的實際需求是有區別的;比如2個Student實例,他們都有身高、年齡、名字,我們現在只需要他們2個的名字和年齡一致即認爲他們是同一個實例,那麼用系統自帶的equals方法時則無法比較成功,如果我們重寫equals則可以按照我們的要求進行對象的內容比較。


當我們自定義的一個類,想要把它的實例保存在集合中時,我們也需要重寫這兩個方法;集合(Collection)有兩個類,一個是List,一個是Set


2.重寫equals的同時也要重寫hashCode方法?

    equals與hashCode的關係:

      如果兩個對象相同(即用equals比較返回true),那麼它們的hashCode值一定要相同;
      如果兩個對象的hashCode相同,它們並不一定相同(即用equals比較返回false)  ;

比較的時候是先對hashCode進行比較,如果hashCode不一致,那麼2個對象不相同;如果hashCode一致,則再進行equals進行比較。爲什麼要這樣做呢? 因爲hashCode的比較效率很高。


3.關於equals方法的幾個比較

    if(this==obj),this指的是當前對象,==比較的是2個對象的引用的內存地址,如果比較對象跟當前對象的內存地址一致,則2個對象是相同的。

    if(null==obj),如果被比較對象爲null,則2個對象不相同,2個null對象不是相同的

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章