String原始碼中的HashCode演算法

2021-09-25 20:00:14 字數 1527 閱讀 9376

string中hashcode方法原始碼如下:

/** the value is used for character storage. */  

//儲存符串截成的字元陣列

private final char value;

/** cache the hash code for the string */

// default to 0 用以快取計算出的hashcode值

private int hash;

/**

* returns a hash code for this string. the hash code for a

*stringobject is computed as

*

* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

*

* usingintarithmetic, wheres[i]is the

* ith character of the string,nis the length of

* the string, and^indicates exponentiation.

* (the hash value of the empty string is zero.)

* * @return a hash code value for this object.

*/

public int hashcode()

hash = h;

} return h;

} 例子:

用**列印出string str = 「abcd」;的hashcode為2987074

string中hashcode計算

a,b,c,d的ascii碼值分別為:97,98,99,100;

string str = 「abcd」; // 此時value = 因此

for迴圈會執行4次

第一次:h = 31*0 + a = 97

第二次:h = 31*97 + b = 3105

第三次:h = 31*3105 + c = 96354

第四次:h = 31*96354 + d = 2987074

由以上**計算可以算出 str 的hashcode = 2987074 剛好與 system.out.println(new string(「abcd」).hashcode()); 相同。

在原始碼的hashcode的注釋中還提供了乙個多項式計算方式:

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]

s[0] :表示字串中指定下標的字元

n:表示字串中字元長度

a31^3 + b31^2 + c*31^1 + d = 2987074 + 94178 + 3069 + 100 = 2987074 ;

String中equals的原始碼片段

看源 就會發現了。首先做的是比較引用,引用的如果是同乙個物件,直接返回true。做完return就結束了。如果引用不是同乙個位址,就往下走,判斷是否是string的乙個例項。同樣,不是的話直接返回。是的話,拿字串的長度做迴圈的控制變數,做迴圈。此處的value在源 裡面來看,應該就是string的混...

String原始碼總結

1.indexof 方法 if fromindex sourcecount if fromindex 0 if targetcount 0 char first target targetoffset int max sourceoffset sourcecount targetcount for ...

String原始碼解析

string類被final修飾詞修飾,代表不可修改的特性,它實現了三個介面,serializable是序列化介面,compareble是排序介面,char是字串行介面。public final class string implements serializable,comparable,chars...