国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

覆寫hashCode

xcc3641 / 2778人閱讀

摘要:如果調(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ì)收獲頗豐的。

更多關(guān)于java的文章請(qǐng)戳這里:(您的留言意見是對(duì)我最大的支持)

我的文章列表

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

相關(guān)文章

  • 13.java object類

    摘要:常用方法取的對(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è)父類的話,那么它繼承的就...

    wind3110991 評(píng)論0 收藏0
  • 【算】從散列表到HashMap

    數(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)腦筋,還是上圖的那些元素,假如...

    zoomdong 評(píng)論0 收藏0
  • LinkedHashMap 源碼詳細(xì)分析(JDK1.8)

    摘要:關(guān)于的源碼分析,本文并不打算展開講了。大家可以參考我之前的一篇文章源碼詳細(xì)分析。在刪除節(jié)點(diǎn)時(shí),父類的刪除邏輯并不會(huì)修復(fù)所維護(hù)的雙向鏈表,這不是它的職責(zé)。在節(jié)分析鏈表建立過程時(shí),我故意忽略了部分源碼分析。 1. 概述 LinkedHashMap 繼承自 HashMap,在 HashMap 基礎(chǔ)上,通過維護(hù)一條雙向鏈表,解決了 HashMap 不能隨時(shí)保持遍歷順序和插入順序一致的問題。除此...

    Harriet666 評(píng)論0 收藏0
  • Java 8 新特性之默認(rèn)方法(Default Methods)

    摘要:概述引入了新的語(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 為什么...

    QLQ 評(píng)論0 收藏0
  • 解讀 Java 8 HashMap

    摘要:在二叉查找樹強(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...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<