摘要:如果調(diào)用父類的方法,且返回值是返回的值卻不同,因此在覆寫方法的同時(shí)覆寫方法。這樣才能最大限度地保證,在程序運(yùn)行過程中盡可能少的出現(xiàn)莫名其妙的錯(cuò)誤。
在比較兩個(gè)實(shí)例是否相等的時(shí)候,通常會(huì)覆寫equal()方法,然后對(duì)類對(duì)象的每一成員進(jìn)行逐一比較,但是JavaSE6規(guī)范如下:
應(yīng)用程序的執(zhí)行期間,只要對(duì)象的equals方法的比較操作所用到的信息沒有被修改,那么對(duì)這同一個(gè)對(duì)象調(diào)用多次,hashCode方法都必須始終如一地返回同一個(gè)整數(shù)。在同一個(gè)應(yīng)用程序的多次執(zhí)行過程中,每次執(zhí)行所返回的整數(shù)可以不一致。
如果兩個(gè)對(duì)象根據(jù)equals()方法比較是相等的,那么調(diào)用這兩個(gè)對(duì)象中任意一個(gè)對(duì)象的hashCode方法都必須產(chǎn)生同樣的整數(shù)結(jié)果。
如果調(diào)用父類的equal()方法,且x.equal(y)返回值是true,返回的hashCode值卻不同,因此在覆寫equal()方法的同時(shí)覆寫hashCode()方法。這樣才能最大限度地保證,在程序運(yùn)行過程中盡可能少的出現(xiàn)莫名其妙的錯(cuò)誤。
再此之前我們先看一下String類中的hashCode()方法:
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
大家可能會(huì)覺得莫名其妙,hashCode()方法返回的是一個(gè)int類型的值,難道這就是所謂的hashCode?不要急,我們來看一段話,
一個(gè)好的散列函數(shù)通常傾向于“為不相等的對(duì)象產(chǎn)生不相等的散列碼”
對(duì)于對(duì)象中的每個(gè)關(guān)鍵域f(指equal方法中涉及的每個(gè)域),完成以下步驟:如果該域是boolean類型,則計(jì)算(f?1:0);
如果該域是byte、char、short或者int計(jì)算(int)f;
如果該域是long型,計(jì)算(int)(f^(f>>>32));
如果該域是float類型,計(jì)算Float.floatTOIntBits(f);
如果該域是double類型,計(jì)算Double.doubleToLongBits(f),然后再根據(jù)long型計(jì)算得到散列值;
如果該域是一個(gè)引用對(duì)象,并且該類的equal方法通過遞歸調(diào)用equal的方法來比較這個(gè)域,則同樣為這個(gè)域遞歸調(diào)用hashCode,如果這個(gè)域?yàn)榭眨瑒t返回0;
-如果該域是一個(gè)數(shù)組,則要把每一個(gè)元素當(dāng)作多帶帶的域來處理按照下面的公式,把上面計(jì)算得到的散列碼c合并到result中
result=31*result+c;
--------------摘自Effective Java
這是EffectiveJava中給出的計(jì)算散列碼的方法,當(dāng)然,方法并不是唯一,只要我們保證相同的對(duì)象會(huì)產(chǎn)生相同的散列碼,不同的獲得的散列碼不同就可以了。
現(xiàn)在我們回過頭來看看String類中的hashCode方法
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) {//判斷hash值不為0,字符串不為空(即長(zhǎng)度大于0) char val[] = value;//將字符串的值轉(zhuǎn)化為char型數(shù)組 for (int i = 0; i < value.length; i++) { h = 31 * h + val[i];//遍歷char數(shù)組中的每一個(gè)元素通過計(jì)算得到hash值 } hash = h; } return h; }
看到這里相信大家已經(jīng)明了,hash散列碼的意義所在,
這里我們給出一段三個(gè)域都是int的hash值計(jì)算實(shí)例
@Override public int hashCode() { int result = hashCode; //生成對(duì)象的唯一散列碼 if (result == 0) { result = result * 31 + areaCode; result = result * 31 + prefix; result = result * 31 + lineNumber; hashCode=result; } return hashCode; }
最后,如果大家想深入學(xué)習(xí)java的話,建議大家看一看effective java,相信會(huì)收獲頗豐的。
我的文章列表
Email:sxh13208803520@gmail.com
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/66959.html
摘要:常用方法取的對(duì)象信息類的方法返回一個(gè)字符串,該字符串由類名對(duì)象是該類的一個(gè)實(shí)例標(biāo)記符和此對(duì)象哈希碼的無符號(hào)十六進(jìn)制表示組成。方法返回的運(yùn)行時(shí)類類型。至于同一個(gè)應(yīng)用程序在不同執(zhí)行期所得的調(diào)用結(jié)果,無需一致。 概念 object 類位于 java.lang 包中,是所有 Java 類的祖先,Java 中的每個(gè)類都由它擴(kuò)展而來. 在定義一個(gè)類時(shí),如果沒有明確的繼承一個(gè)父類的話,那么它繼承的就...
數(shù)組 數(shù)組是我們比較熟悉的一種數(shù)據(jù)結(jié)構(gòu):固定大小,索引(下標(biāo))對(duì)應(yīng)的槽位用以存儲(chǔ)數(shù)據(jù): showImg(https://segmentfault.com/img/bV7rJ8?w=480&h=119); 我們要在數(shù)組中查找一個(gè)值,比如紅框圈中的 元素5 ,可以通過遍歷或者排序后二分的方式達(dá)到目的。沒有更快捷的查找方式了嗎?顯然是有的,比如Map。我們對(duì)存 / 取動(dòng)一動(dòng)腦筋,還是上圖的那些元素,假如...
摘要:關(guān)于的源碼分析,本文并不打算展開講了。大家可以參考我之前的一篇文章源碼詳細(xì)分析。在刪除節(jié)點(diǎn)時(shí),父類的刪除邏輯并不會(huì)修復(fù)所維護(hù)的雙向鏈表,這不是它的職責(zé)。在節(jié)分析鏈表建立過程時(shí),我故意忽略了部分源碼分析。 1. 概述 LinkedHashMap 繼承自 HashMap,在 HashMap 基礎(chǔ)上,通過維護(hù)一條雙向鏈表,解決了 HashMap 不能隨時(shí)保持遍歷順序和插入順序一致的問題。除此...
摘要:概述引入了新的語(yǔ)言特性默認(rèn)方法。覆寫默認(rèn)方法,這跟類與類之間的覆寫規(guī)則相類似。靜態(tài)默認(rèn)方法的另一個(gè)特性是接口可以聲明并且可以提供實(shí)現(xiàn)靜態(tài)方法本文首發(fā)于凌風(fēng)博客新特性之默認(rèn)方法作者凌風(fēng) 1. 概述 Java 8 引入了新的語(yǔ)言特性——默認(rèn)方法(Default Methods)。 默認(rèn)方法允許您添加新的功能到現(xiàn)有庫(kù)的接口中,并能確保與采用舊版本接口編寫的代碼的二進(jìn)制兼容性。 1.1 為什么...
摘要:在二叉查找樹強(qiáng)制一般要求以外,對(duì)于任何有效的紅黑樹增加了如下的額外要求節(jié)點(diǎn)是紅色或黑色。紅黑樹有哪些應(yīng)用場(chǎng)景內(nèi)核和系統(tǒng)調(diào)用實(shí)現(xiàn)中使用的完全公平調(diào)度程序使用紅黑樹。 前言 這篇文章是記錄自己分析 Java 8 的 HashMap 源碼時(shí)遇到的疑問和總結(jié),在分析的過程中筆者把遇到的問題都記錄下來,然后逐一擊破,如果有錯(cuò)誤的地方,希望讀者可以指正,筆者感激不盡。 疑問與解答 什么是 initia...
閱讀 746·2021-11-11 16:54
閱讀 3066·2021-09-26 09:55
閱讀 2019·2021-09-07 10:20
閱讀 1211·2019-08-30 10:58
閱讀 1057·2019-08-28 18:04
閱讀 710·2019-08-26 13:57
閱讀 3599·2019-08-26 13:45
閱讀 1164·2019-08-26 11:42