我對java String的理解 及 源碼淺析


摘要: 摘要: 原創出處: http://www.cnblogs.com/Alandre/ 泥沙磚瓦漿木匠 但願轉載,保留摘要,謝謝!html

天天起牀告訴本身,本身的目標是 」技術 + 英語 還有生活「! -泥沙磚瓦漿木匠

一.char提及到Stringjava

二.String的認識及源碼淺析apache

一.char提及到String

這也是本身第二次回過頭來啃java基礎書,小生自認爲愚昧無知。若是大神有好的教育,能夠評論私信。如下都是個人見解:
爲何說char 呢,我這裏先賣個關子。在java中,char是用unicode編碼的,佔16位(2字節)。從ansi編碼(1字節)到unicode編碼(2字 節)。Java中使用Unicode的緣由是,Java的Applet(網頁)運行,Unicode裏面包含最多最廣好比:中 文,English,Spanish,German, French等。所以,char屬於java的基本類型之一,使用也很方便。數組

注意:在java中,char類型用UTF-16編碼描述的一個代碼單元。

二.String的認識及源碼淺析

這裏我就解答則個關子,剛纔爲啥說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 算是個常常用到的東西,老生常談了。看看本身見解,你們各抒己見吧。

一.char提及到String

二.String的認識及源碼淺析

參考資料:

http://elmer08.blog.163.com/blog/static/71204254201011121382438/

http://blog.csdn.net/sunzhenhua0608/article/details/7628663

http://blog.csdn.net/f562867448/article/details/8679550

相關文章
相關標籤/搜索