String 是java開發中最經常使用的類之一了。今天去看下jdk對String的實現。java
首先來看下String類被final修飾符修飾的,也就是說String類是一個最終類,它不能被繼承。而後在看看String實現了那些接口呢: Serializable, Comparable<String>, CharSequence,分別是序列化、比較以及字符序列。數組
接着往下看,發現其實String的根本就是一個char數組的封裝。並且這個數組被final修飾,也就是說當調用substring(int beginIndex)等方法會改變字符串的長度時,實際上是生成了一個新的String 字符串。在往下看是一個ObjectStreamField數組,ObjectStreamField是什麼類,幹嘛用的呢?安全
A description of a Serializable field from a Serializable class. An array
of ObjectStreamFields is used to declare the Serializable fields of a class.this
序列化類的可序列化字段的描述。一個ObjectStreamField數組用來聲明序列化類的序列化字段集合。線程
翻譯不過關,請見諒,也就是說 String類聲明不序列話任何字段。String在《Object Serialization Stream Protocol》有特殊處理。嗯,大概是這樣。若是理解錯誤,請你們指出。翻譯
在往下就是String的構造方法了。以下是其中的一個:繼承
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}接口
String實例的value字段保存的是一個傳入值的複製。爲的是防止後續對傳入值的修改影響到String,若是不是存儲備份,其實至關與暴露了String的內部字段——value。另外的一個值得注意的構造方法是:ip
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}開發
對StringBuffer有同步鎖,而其餘的構造方法是沒有同步鎖的。這應該是履行StringBuffer線程安全的承諾吧。
另一個是toLowerCase,toUpperCase這兩個方法和想象中的有所不一樣,光方法的長度,這兩個方法應該是String裏較長的方法之二了。實事上很複雜…… 。valueOf(...)類方法基本上是對Integer.toString(i)等的封裝。
另外:intern() 是native 方法。
String 雖然經常使用,但其實不簡單…… (待續。)