摘要: 摘要: 原創出處: http://www.cnblogs.com/Alandre/ 泥沙磚瓦漿木匠 但願轉載,保留摘要,謝謝!html
一.char提及到Stringjava
二.String的認識及源碼淺析apache
這也是本身第二次回過頭來啃java基礎書,小生自認爲愚昧無知。若是大神有好的教育,能夠評論私信。如下都是個人見解:
爲何說char 呢,我這裏先賣個關子。在java中,char是用unicode編碼的,佔16位(2字節)。從ansi編碼(1字節)到unicode編碼(2字 節)。Java中使用Unicode的緣由是,Java的Applet(網頁)運行,Unicode裏面包含最多最廣好比:中 文,English,Spanish,German, French等。所以,char屬於java的基本類型之一,使用也很方便。數組
這裏我就解答則個關子,剛纔爲啥說String和char密切相關。由於java字符串String就是char值序列(其實就是final的char數組)組成。在源碼中很好的證實了這一點:this
/** The value is used for character storage. */ private final char value[];
爲了證實上面的東西,你們能夠來寫一段好玩的代碼:
public class Test { \u0070\u0075\u0062\u006C\u0069\u0063 static void main(String\u005B\u005D args) { System.out.println("this is not PI: \u03C0"); } }
運行後你能夠看到如下輸出:編碼
this is not PI: π
但有些人不要誤解,好比java的spa
String name = "Jeff Li";
覺得它就是想C語言中的 char name[]="Jeff Li"; 這種認知是錯誤的,其餘它更像char*指針:.net
char *name = "Jeff Li";
最多見的也是最常常被使用的 boolean equals()分析,源碼以下:指針
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
從源碼中慢慢道來:例子(A.equals(B))
第一:if (this == anObject)code
//this表明A,其實就是判斷其B對象是否和A的引用型變量表示的是兩個變量在堆中存儲的地址(就是棧引用同樣內容天然同樣)。
第二: if (anObject instanceof String)
//java 中的instanceof 運算符是用來在運行時指出對象是不是特定類的一個實例。這句話爲了下面強轉 String anotherString = (String) anObject;
第三:我剛開始有些疑惑源碼中的:我以爲是String類型的anotherString獲取到char值序列(char[]),這就回到了前面內容。
anotherString.value
猜想是如上意思,若是大牛有的能夠說的地方,請說。由於我本身想實現一個簡單的StringCopy時,這個總是不行,不知道爲何。
第四:剩下的就是char[]直接循環比較了。
還有些經常使用的 split (正則) format 這裏不發表一一見解了。
另外有一句很好的代碼分享:來自org.apache.commons.lang
public static boolean isEmpty(String str) { return str == null || str.length() == 0; }
String 算是個常常用到的東西,老生常談了。看看本身見解,你們各抒己見吧。
參考資料:
http://elmer08.blog.163.com/blog/static/71204254201011121382438/