JDK原始碼解析 String類

2021-10-10 10:03:52 字數 4596 閱讀 4479

equals方法相信大家都比較熟悉和了解了,string的equals方法主要用來比較string物件內容序列的異同,原始碼如下:

public boolean equals

(object anobject)

// 判斷是否是string型別

if(anobject instanceof

string

)return

true;}

}return

false

;}

contentequals與equals方式差不多(唯一區別就是equals方法只能是string而這個方法只要是charsequence子類都可以)如:stringbuffer,stringbuilder與string的比較

// 與equals方式差不多(唯一區別就是equals方法只能是string而這個方法只要是charsequence子類都可以)

public boolean contentequals

(charsequence cs)

}else

}// argument is a string

if(cs instanceof

string

)// argument is a generic charsequence

char v1[

]= value;

int n = v1.length;

if(n != cs.

length()

)for

(int i =

0; i < n; i++)}

return

true

;}

它是先比較對應字元的大小(ascii碼順序),如果第乙個字元和引數的第乙個字元不等,結束比較,返回他們之間的差值,如果第乙個字元和引數的第乙個字元相等,則以第二個字元和引數的第二個字元做比較,以此類推,直至比較的字元或被比較的字元有一方結束,原始碼如下:

public int compareto

(string anotherstring)

k++;}

return len1 - len2;

}

這個方法是用來判斷從toffset開始,prefix與當前字串是否相等

public boolean startswith

(string prefix, int toffset)

// 從當前字串char陣列索引位置開始查詢傳入的字串是否與之相等

while

(--pc >=0)

}return

true

;}

這個方法是用來判斷當前字元的長度和傳入字串長度相減作為索引,來判斷後面是否相等,如:判斷檔案字尾名等,原始碼如下:

public boolean endswith

(string suffix)

返回指定字元在字串中第一次出現處的索引,如果此字串中沒有這樣的字元,則返回 -1

返回從fromindex開始在字串中第一次出現處的索引,如果此字串中沒有這樣的字元,則返回 -1

返回指定字元在字串中第一次出現處的索引,如果此字串中沒有這樣的字元,則返回 -1

返回從fromindex開始在字串中第一次出現處的索引,如果此字串中沒有這樣的字元,則返回 -1

擷取從beginindex到endindex位置的字串,原始碼如下:

public string substring

(int beginindex, int endindex)

// 結束位置大於當前字串的長度

if(endindex > value.length)

// 結束位置比開始位置小時

int sublen = endindex - beginindex;

if(sublen <0)

// 如果開始位置等於0並且結束位置等於當前字串的長度返回自己本身,否則擷取

return

((beginindex ==0)

&&(endindex == value.length))?

this

:new

string

(value, beginindex, sublen);}

public

string

(char value[

], int offset, int count)

if(count <=0)

if(offset <= value.length)

}// note: offset or count might be near -1>>>1.

if(offset > value.length - count)

this

.value = arrays.

copyofrange

(value, offset, offset+count);}

public

static char[

]copyofrange

(char[

] original, int from

, int to)

/** * @param src 原陣列

* @param srcpos 從元資料的起始位置開始

* @param dest 目標陣列

* @param destpos 目標陣列起始位置

* @param length 要copy的長度

*/public

static

void

arraycopy

(object src, int srcpos, object dest, int destpos, int length)

根據正規表示式分割字串,limit限定分割後的子字串個數,超過數量限制的情況下前limit-1個子字串正常分割,最後乙個子字串包含剩下所有字元

public string[

]split

(string regex, int limit)

else

}// if no match was found, return this

if(off ==0)

return

newstring

;// add remaining segmentif(

!limited || list.

size()

< limit)

list.

add(

substring

(off, value.length));

// construct result

int resultsize = list.

size()

;// 當limit為0時 從最後乙個往前所有的空字串""全部被清空

if(limit ==0)

} string[

] result =

newstring

[resultsize]

;return list.

sublist(0

, resultsize)

.toarray

(result);}

// 通過正規表示式特俗處理,邏輯與上面邏輯基本類似

return pattern.

compile

(regex)

.split

(this

, limit)

;}

字串拼接,原始碼如下:

public string concat

(string str)

int len = value.length;

// 建立拼接以後字串長度的陣列,只有當前字串資料

char buf[

]= arrays.

copyof

(value, len + otherlen)

;// 將傳入的字串加入buf

str.

getchars

(buf, len)

;return

newstring

(buf,

true);

}

判斷是否包含某個字串,原理與indexof一致

public boolean contains

(charsequence s)

字串替換函式,oldchar要被替換的字元,newchar替換後的字元

public string replace

(char oldchar, char newchar)}if

(i < len)

while

(i < len)

return

newstring

(buf,

true);

}}return

this

;}

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...

String原始碼解析

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

JDK原始碼解析 ThreadLocal

說明 本文是jdk 1.8版本 1.簡介 threadlocal 又叫做執行緒本地變數,也被稱為執行緒本地儲存。threadlocal 為 變數 在每乙個執行緒中建立 乙個 副本 不是原來變數的引用 每乙個執行緒都會獨自擁有變數副本,而不會相互影響。2.實現方式 1 set 方法,因為執行緒thre...