JDK中String類的原始碼分析 二

2022-08-17 05:51:13 字數 2652 閱讀 5216

1、startswith(string prefix, int toffset)方法

包括startswith(*),endswith(*)方法,都是呼叫上述乙個方法

1

public

boolean startswith(string prefix, int

toffset)

11while (--pc >= 0) 15}

16return

true

;17 }

上述演算法的時間複雜度,最差的情況下為o(n)(取決於匹配子串的長度),最理想的情況下為o(1);

2、indexof方法

有多個過載的方法,引數可以為字元,也可以為字串

1

static

int indexof(char source, int sourceoffset, int

sourcecount,

2char target, int targetoffset, int

targetcount,

3int

fromindex)

7if (fromindex < 0)

10if (targetcount == 0)

1314

char first =target[targetoffset];

15int max = sourceoffset + (sourcecount -targetcount);

1617

for (int i = sourceoffset + fromindex; i <= max; i++)

2223

/*found first character, now look at the rest of v2

*/24

if (i <=max) 34}

35}36return -1;

37 }

這個匹配子串的方法比較複雜,值得深入研究

3、substring方法

在jdk1.7之前的**中,substring存在嚴重記憶體洩露問題,然而,這個問題在jdk1.7之後的版本中都有了改善;

因為jdk1.7中修改了構造方法,呼叫arrays.copyofrange()方法,只是複製出陣列的一部分;

關於string類的構造方法,可以參看: jdk中string類的原始碼分析(一)

4、concat方法

連線兩個字串

1

public

string concat(string str)

6int len =value.length;

7char buf = arrays.copyof(value, len +otherlen);

8str.getchars(buf, len);

9return

new string(buf, true

);10 }

5、split方法,切割字串

1

public string split(string regex, int

limit) else 28}

29//

if no match was found, return this

30if (off == 0)

31return

new string;

3233

//add remaining segment

34if (!limited || list.size() 35list.add(substring(off, value.length));

3637

//construct result

38int resultsize =list.size();

39if (limit == 0)

40while (resultsize > 0 && list.get(resultsize - 1).length() == 0)

41 resultsize--;

42 string result = new

string[resultsize];

43return list.sublist(0, resultsize).toarray(result);44}

45return pattern.compile(regex).split(this

, limit);

46 }

6、trim方法,去除字串兩端的空格

1

public

string trim()

9while ((st < len) && (val[len - 1] <= ' '))

12return ((st > 0) || (len < value.length)) ? substring(st, len) : this

;13 }

演算法時間複雜度在o(log(n))左右,擷取,建立乙個新的字串;

總結:在string類中的大多數方法,都存在new物件的操作,因為string的不可變性,如果大量的呼叫這些方法,在記憶體中會產生大量的string物件;

這樣對gc的壓力很非常大,很可能會出現記憶體溢位;

JDK原始碼解析 String類

equals方法相信大家都比較熟悉和了解了,string的equals方法主要用來比較string物件內容序列的異同,原始碼如下 public boolean equals object anobject 判斷是否是string型別 if anobject instanceof string ret...

JDK中String類的原始碼分析 一

1 string類是final的,不允許被繼承 1 the value is used for character storage.2 private final char value 34 cache the hash code for the string 5 private int hash ...

JDK 10 原始碼之String類

一 成員變數 1 stable 表示安全,該欄位不會為null。private final byte value 位元組陣列儲存字串的值 2 cache the hash code for the string private int hash default to 0 3 private fina...