hashCode布疼,equals摊趾,==

public native int hashCode()

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

為什么要有hashCode

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

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

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

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

public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 為一個引用
        String b = new String("ab"); // b為另一個引用,對象的內容一樣
        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方法比較的對象的內存地址罪针,則String的equals方法比較的是對象的值。
當創(chuàng)建String類型的對象時黄伊,虛擬機會在常量池中查找有沒有已經存在的值和要創(chuàng)建的值相同的對象泪酱,如果有就把它賦值給當前引用,如果沒有就再常量池中重新創(chuàng)建一個String對象还最。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末墓阀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拓轻,更是在濱河造成了極大的恐慌斯撮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦即,死亡現(xiàn)場離奇詭異吮成,居然都是意外死亡橱乱,警方通過查閱死者的電腦和手機辜梳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泳叠,“玉大人作瞄,你說我怎么就攤上這事∥H遥” “怎么了宗挥?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長种蝶。 經常有香客問我契耿,道長,這世上最難降的妖魔是什么螃征? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任搪桂,我火速辦了婚禮,結果婚禮上盯滚,老公的妹妹穿的比我還像新娘踢械。我一直安慰自己,他們只是感情好魄藕,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布内列。 她就那樣靜靜地躺著,像睡著了一般背率。 火紅的嫁衣襯著肌膚如雪话瞧。 梳的紋絲不亂的頭發(fā)上嫩与,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音交排,去河邊找鬼蕴纳。 笑死,一個胖子當著我的面吹牛个粱,可吹牛的內容都是我干的古毛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼都许,長吁一口氣:“原來是場噩夢啊……” “哼稻薇!你這毒婦竟也來了?” 一聲冷哼從身側響起胶征,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤塞椎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睛低,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體案狠,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年钱雷,在試婚紗的時候發(fā)現(xiàn)自己被綠了骂铁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡罩抗,死狀恐怖拉庵,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情套蒂,我是刑警寧澤钞支,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站操刀,受9級特大地震影響烁挟,放射性物質發(fā)生泄漏。R本人自食惡果不足惜骨坑,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一撼嗓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卡啰,春花似錦静稻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亡脸,卻和暖如春押搪,著一層夾襖步出監(jiān)牢的瞬間树酪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工大州, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留续语,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓厦画,卻偏偏與公主長得像疮茄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子根暑,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容