先看屬性
底層是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,所以有必要把這些...