原始碼分析之String

2021-10-25 02:32:54 字數 1841 閱讀 4883

先看屬性

底層是char陣列,一目了然

可以看到,value是儲存string的內容的,即當使用string str = 「abc」;的時候,本質上,"abc"是儲存在乙個char型別的陣列中的。

**string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value變數不可再指向其他陣列,但是可以改變value陣列中某乙個元素的值。

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

private

final

char value[

];

而hash是string例項化的hashcode的乙個快取。因為string經常被用於比較,比如在hashmap中。如果每次進行比較都重新計算hashcode的值的話,那無疑是比較麻煩的,而儲存乙個hashcode的快取無疑能優化這樣的操作。

hash用來儲存某乙個string例項自己的雜湊值,可以說是雜湊值的乙個快取,因此string特別適合放入hashmap中,作為key來使用。每次插入乙個鍵值対時,不需要重新計算key的雜湊值,直接取出key的快取hash值即可,在一定程度上,加快了hashmap的效率。

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

private

int hash;

// default to 0

序列化id,用於判斷序列化時候的版本啥的

/** use serialversionuid from jdk 1.0.2 for interoperability */

private

static

final

long serialversionuid =

-6849794470754667710l;

構造方法

string支援多種初始化方法,包括接收string,char,byte,stringbuffer等多種引數型別的初始化方法。但本質上,其實就是將接收到的引數傳遞給全域性變數value

public

string()

知道了string其實內部是通過char實現的,那麼就不難發現length(),isempty(),charat()這些方法其實就是在內部呼叫陣列的方法。

public

intlength()

public

boolean

isempty()

public

char

charat

(int index)

else

}

public

static

char

charat

(byte

value,

int index)

public

boolean

equals

(object anobject)

if(anobject instanceof

string)}

return

false

;}

redis之string原始碼分析

string資料型別的物件編碼有兩種,分別是embstr和raw。兩種編碼的區別並不大,embstr相對於raw,記憶體空間連續。兩者的資料格式見下圖 redis的string資料之所以使用embstr和raw兩種編碼格式,是為了當乙個string物件的值比較小時,使用乙個連續的記憶體分割槽存放re...

golang 原始碼分析之string

stringgo 語言中的字串其實是乙個唯讀的位元組陣列string 對應的結構 type stringheader struct type stringstruct struct 字串拼接 concatstrings runtime concatstrings func concatstrings...

String原始碼分析

前言 string類在日常開發過程中使用頻率非常高,平時大家可能看過string的原始碼,但是真的認真了解過它麼,筆者在一次筆試過程中要求寫出string的equals方法,瞬間有點懵逼,憑著大致的理解,算是寫出來了,可是下來一翻string的原始碼頓悟,原來自己寫得是多麼的low,所以有必要把這些...