string中hashcode方法原始碼如下:
* using/** the value is used for character storage. */
object is computed as//儲存符串截成的字元陣列
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
*string
*
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]*
int
arithmetic, wheres[i]
is the
* ith character of the string,n
is 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...