更新時間:2023年02月15日17時08分 來源:傳智教育 瀏覽次數(shù):
(1)問題分析:
考官主要想對hashCode()方法和equal()方法作用和效率上進行比較。
(2)核心答案講解:
equal()相等的兩個對象他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。
hashCode()相等的兩個對象他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。
對于需要大量并且快速的對比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equal(),如果equal()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性!
(3)問題擴展:
hashCode的重寫:
hashCode()和equal()一樣都是基本類Object里的方法,而和equal()一樣,Object里hashCode()里面只是返回當前對象的地址,如果是這樣的話,那么我們相同的一個類,new兩個對象,由于他們在內(nèi)存里的地址不同,則他們的hashCode()不同,所以這顯然不是我們想要的,所以我們必須重寫我們類的hashCode()方法,即一個類,在hashCode()里面返回唯一的一個hash值。
equals方法的作用:
默認情況(沒有覆蓋equals方法)下equals方法都是調(diào)用Object類的equals方法,而Object的equals方法主要用于判斷對象的內(nèi)存地址引用是不是同一個地址(是不是同一個對象);
要是類中覆蓋了equals方法,那么就要根據(jù)具體的代碼來確定equals方法的作用了,覆蓋后一般都是通過對象的內(nèi)容是否相等來判斷對象是否相等。
(4)結(jié)合項目中使用:
equals方法是默認的判斷2個對象是否相等的方法,在Object類里有實現(xiàn),判斷的是2個對象的內(nèi)存地址。在hibernate中,不允許存在同類對象中有2個一樣的實例。hibernate通過equals方法做判斷。如:
User u1 = new User(“張三”); User u2 = new User(“李四”); User u3 = new User(“張三”);
按照項目需求,用戶只要名字相同,就表示同一個用戶,所以我們認為,u1和u3是同一個人,同一個對象。但是因為u1,u2,u3三者的內(nèi)存地址都各不相同,所以hibernate會認為這是3個不同的對象。這與我們假設的出了矛盾。 因此,我們將覆蓋Object類中的equals方法。
這樣hibernate在插入數(shù)據(jù)的時候,如果傳過來一個叫”張三”的用戶,hibernate會先判斷有沒有叫“張三”的用戶,如果沒有,就允許插入,如果有,就不允許插入。這樣做可以保證數(shù)據(jù)的高度一致性,不同的項目有不同的需求,所以要根據(jù)自己的需求來覆蓋equals方法。
public class User{ private String userName; ….//get ,set方法省 //覆蓋Object里的equals方法 public boolean equals(Object arg0){ if (!(arg0 instanceof User)){ return false; } User user = (User)arg0; //如果名字相同,則表示屬于同一個對象。 if(user.getName().equals(this.getName)){ return true; }else{ return false; } } }