1. 程式人生 > >原始碼分析篇之String原始碼分析二

原始碼分析篇之String原始碼分析二

    前面已經分析過String原始碼為什麼是不可變的,同時通過我們常用的String的相關的類StringBuffer和StringBuilder,我們可以發現String類中欄位名被定義為了final型別,這樣的話將只能被賦值一次。接下來,繼續看String原始碼實現的介面

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    可以看到介面包括Serializable,Comparable和CharSequence 3個介面,其中Serializable介面就是一個標識,主要用於在http的傳輸過程中的序列化。而Comparable這個介面在我看來就比較特殊了。這個介面是一個用來比較大小的介面。下面看原始碼

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}

這就是實現String實現comparable介面的具體方法。這個方法返回值 0 代表等於,正數代表大於,負數代表小於。在學習這個方法的過程中以前我從來都不知道collects.sort()方法究竟是通過什麼來進行排序的,我們可以發現只有實現了這個介面的集合才能通過collects.sort()方法進行排序。這個也是為什麼我們可以對String進行排序的原因。

第二點就是comparable和comparator之間的區別,這2個方法都是比較器,在我看來最大的區別在於comparable的實現類在類的內部。有些人認為這樣子實現並不好,所以就想到了使用comparator這個方法。這個方法其實是建立一個新的類,這個類專門用來作為某個類的比較類。這也就是二者之間的區別。

接下來是charsequence介面,其實字串全部都是用字元在進行表示。而這個介面我還沒有看出有什麼特別的,只是能夠知道這裡相當於是把對於字串常用的功能給抽象出來了。從StringBuffer和StringBuilder這2個類可以看到都實現了這個介面。這裡談到StringBuffer和StringBuilder的話就不得不提下這2者之間的區別其實非常的簡單。StringBuffer執行緒安全,而StringBuilder執行緒不安全而具體的實現方式的話其實StringBuffer和StringBuilder中的實現方式都是一樣的,不同的是StringBuffer實現的時候會加上一個synchronized也就達到了執行緒安全的目的。

其實在這裡我還是有那麼一丟丟的困擾的,比如說明明父類已經實現了charsequence介面,為什麼子類stringBuffer和StringBuilder類還是要去實現charsequence介面呢,這個原因是什麼呢。這個問題我下期進行解答。下期會說些String的常用方法比如equals方法等等。同時講講stringbuilder的append的實現。這都是在開發中經常用到的方法。