HashCode()函數詳解


Interger

    public static int hashCode(int value) {
        return value;
    }

Interger類型數據的hashcode僅僅是返回其原有的值

Float

public static int hashCode(float value) {
        return floatToIntBits(value);
}
public static int floatToIntBits(float value) {
        if (!isNaN(value)) {
            return floatToRawIntBits(value);
        }
        return 0x7fc00000;
}

返回將float數據ieee754標准的二進制視為十進制的數

例9.0

9.0
寫成二進制為1001,也可寫成1.001×2^3.
符號位為0
浮點數的階碼為3+127=130=1000 0010
數值位默認刪除第一位整數位的1,只保留小數點后的數。為00100000補夠后面的零
所以9.0的表示就是
0 
1000 0010
0010 0000 0000 0000 0000 000

將9.0的二進制表示視為十進制,即將01000 001000100000000000000000000視為一個十進制整數的,所以9.0f的hashcode值為1091567616

Double

    public static int hashCode(double value) {
        long bits = doubleToLongBits(value);
        return (int)(bits ^ (bits >>> 32));
    }

bits是雙精度規格化浮點數的二進制
Double類的數據的hashcode是返回bits右移32位然后與bits相異或的結果

浮點數的表示


最高位是符號位(0為正,1為負)
其后的11位是階碼位以2為底,用移碼表示,移碼的偏置量是2^(11-1)-1=1023,
后52位是尾數的數值位。

例:浮點數是9.0

寫成二進制則為1001,也可寫成1.001×2^3.
符號位為0
浮點數的階碼為3+1023=1026=10000000010
數值位默認刪除第一位整數位的1,只保留小數點后的數。為00100000補夠后面的零
所以9.0的表示就是
0 
10000000010
0010000000000000000000000000000000000000000000000000

異或

當兩個數不同時為1,相同時為0

0∧0=0,0∧1=1,1∧1=0,1∧0=1

String

    public static int hashCode(byte[] value) {
        int h = 0;
        int length = value.length >> 1;
        for (int i = 0; i < length; i++) {
            h = 31 * h + getChar(value, i);
        }
        return h;

byte[] value傳過來的是String每一個字符轉成ascii碼后的數組.
至於為什么選擇31作為乘子,可以看 這篇文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM