1. 程式人生 > >關於重寫equals和hashCode

關於重寫equals和hashCode

equals java 知識點

  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對象不是相同的

本文出自 “12257285” 博客,請務必保留此出處http://12267285.blog.51cto.com/12257285/1929447

關於重寫equals和hashCode