hashCode,equals,==

public native int hashCode()

hashCode()的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整數(shù)。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode()定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode()函數(shù)。另外需要注意的是Object的hashCode方法是本地方法,也就是用c或者c++實現(xiàn)的,該方法通常用來將對象的內(nèi)存地址轉(zhuǎn)換為整數(shù)之后返回。
散列表存儲的是鍵值對(key-value),特點是能根據(jù)“鍵”快速的檢索出對應(yīng)的“值”,這其中就利用到了散列碼(可以快速找到所需要的對象)

為什么要有hashCode

以HashSet如何檢查重復(fù)為例:當(dāng)把對象假如HashSet時,HashSet會先計算對象的hashCode值來判斷對象加入的位置,同時也會與其他已經(jīng)加入的對象的hashCode值做比較,如果沒相符的hashCode,HashSet會假設(shè)對象沒有重復(fù)出現(xiàn)。但是如果發(fā)現(xiàn)有相同hashCode值得對象,這時就會調(diào)用equals方法來檢查hashcode相等的對象是否真的相同,如果兩者相同,HashSet就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置,這樣我們就大大減少了equals的 次數(shù),相應(yīng)就大大提高了執(zhí)行效率。

hashCode()和equals的相關(guān)規(guī)定
1.如果兩個對象相等,則hashCode一定也是相同的
2.兩個對象相等,對兩個對象分別調(diào)用equals方法都返回true
3.兩個對象有相同的hashCode值,但是也不一定是相等的
4.因此,equals方法被覆蓋過,則hashCode方法也必須被覆蓋
5.hashCode()的默認(rèn)行為是對堆上的對象產(chǎn)生獨特值。如果沒有重寫hashCode()。則該class的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數(shù)據(jù))

為什么兩個對象有想相同的hashcode值,他們也不一定是相等的?
因為hashCode()所使用的雜湊算法也許剛好會讓多個對象傳回相同的雜湊度,越糟糕的雜湊算法越容易碰撞,但這也和數(shù)據(jù)值域分布的特性有關(guān)(所謂碰撞也就是指的是不同對象得到相同hashCode)
對于HashSet,如果HashSet在對比的時候,同樣的hashcode有多個對象,它會使用equals來判斷是否真的相同,也就是說hashcode只是用來縮小查找成本。

==與equals
==是判斷兩個對象的地址是不是相等。即判斷兩個對象是不是同一個對象(基本數(shù)據(jù)類型==比較的是值,引用類型==比較的是內(nèi)存地址)
equals是判斷兩個對象是否相等。
1.類沒有覆蓋equals方法,則通過equals比較該類的兩個對象時,等價于通過==比較兩個對象
2.類覆蓋了equals方法,一般我們都覆蓋equals方法來判斷兩個對象的內(nèi)容相等,則返回true

public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 為一個引用
        String b = new String("ab"); // b為另一個引用,對象的內(nèi)容一樣
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 從常量池中查找
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一對象
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

說明:
String中的equals方法是被重寫過的,因為Object的equals方法比較的對象的內(nèi)存地址,則String的equals方法比較的是對象的值。
當(dāng)創(chuàng)建String類型的對象時,虛擬機(jī)會在常量池中查找有沒有已經(jīng)存在的值和要創(chuàng)建的值相同的對象,如果有就把它賦值給當(dāng)前引用,如果沒有就再常量池中重新創(chuàng)建一個String對象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容