教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線:400-618-4000

Java中equals和hashcode的區(qū)別是什么?

更新時(shí)間:2023年02月15日17時(shí)08分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

(1)問(wèn)題分析:

考官主要想對(duì)hashCode()方法和equal()方法作用和效率上進(jìn)行比較。

(2)核心答案講解:

equal()相等的兩個(gè)對(duì)象他們的hashCode()肯定相等,也就是用equal()對(duì)比是絕對(duì)可靠的。

hashCode()相等的兩個(gè)對(duì)象他們的equal()不一定相等,也就是hashCode()不是絕對(duì)可靠的。

對(duì)于需要大量并且快速的對(duì)比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當(dāng)需要對(duì)比的時(shí)候,首先用hashCode()去對(duì)比,如果hashCode()不一樣,則表示這兩個(gè)對(duì)象肯定不相等(也就是不必再用equal()去再對(duì)比了),如果hashCode()相同,此時(shí)再對(duì)比他們的equal(),如果equal()也相同,則表示這兩個(gè)對(duì)象是真的相同了,這樣既能大大提高了效率也保證了對(duì)比的絕對(duì)正確性!


(3)問(wèn)題擴(kuò)展:

hashCode的重寫(xiě):

hashCode()和equal()一樣都是基本類(lèi)Object里的方法,而和equal()一樣,Object里hashCode()里面只是返回當(dāng)前對(duì)象的地址,如果是這樣的話,那么我們相同的一個(gè)類(lèi),new兩個(gè)對(duì)象,由于他們?cè)趦?nèi)存里的地址不同,則他們的hashCode()不同,所以這顯然不是我們想要的,所以我們必須重寫(xiě)我們類(lèi)的hashCode()方法,即一個(gè)類(lèi),在hashCode()里面返回唯一的一個(gè)hash值。

equals方法的作用:

默認(rèn)情況(沒(méi)有覆蓋equals方法)下equals方法都是調(diào)用Object類(lèi)的equals方法,而Object的equals方法主要用于判斷對(duì)象的內(nèi)存地址引用是不是同一個(gè)地址(是不是同一個(gè)對(duì)象);

要是類(lèi)中覆蓋了equals方法,那么就要根據(jù)具體的代碼來(lái)確定equals方法的作用了,覆蓋后一般都是通過(guò)對(duì)象的內(nèi)容是否相等來(lái)判斷對(duì)象是否相等。

(4)結(jié)合項(xiàng)目中使用:

equals方法是默認(rèn)的判斷2個(gè)對(duì)象是否相等的方法,在Object類(lèi)里有實(shí)現(xiàn),判斷的是2個(gè)對(duì)象的內(nèi)存地址。在hibernate中,不允許存在同類(lèi)對(duì)象中有2個(gè)一樣的實(shí)例。hibernate通過(guò)equals方法做判斷。如:

User u1 = new User(“張三”);
User u2 = new User(“李四”);
User u3 = new User(“張三”);

按照項(xiàng)目需求,用戶(hù)只要名字相同,就表示同一個(gè)用戶(hù),所以我們認(rèn)為,u1和u3是同一個(gè)人,同一個(gè)對(duì)象。但是因?yàn)閡1,u2,u3三者的內(nèi)存地址都各不相同,所以hibernate會(huì)認(rèn)為這是3個(gè)不同的對(duì)象。這與我們假設(shè)的出了矛盾。 因此,我們將覆蓋Object類(lèi)中的equals方法。

這樣hibernate在插入數(shù)據(jù)的時(shí)候,如果傳過(guò)來(lái)一個(gè)叫”張三”的用戶(hù),hibernate會(huì)先判斷有沒(méi)有叫“張三”的用戶(hù),如果沒(méi)有,就允許插入,如果有,就不允許插入。這樣做可以保證數(shù)據(jù)的高度一致性,不同的項(xiàng)目有不同的需求,所以要根據(jù)自己的需求來(lái)覆蓋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;
        //如果名字相同,則表示屬于同一個(gè)對(duì)象。
        if(user.getName().equals(this.getName)){
            return true;
        }else{
            return false; 
        }
    }
}
0 分享到:
和我們?cè)诰€交談!