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

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

    上期已經討論了比較器的相關的問題。同時也提出問題明明父類已經實現了某個介面,子類為什麼還是要實現同樣的介面呢。這究竟有什麼意義呢。通過使用度孃的多次探究之後最終我還是沒有發現說它有什麼特別的含義。我認為的最大的含義就是告訴使用者這個類實現了這樣的一個介面。方便使用者進行呼叫。比如說如果父類實現了comparable比較器。那麼試問,當你在使用它的子類的時候如果沒有看到它實現comparable比較器。那麼這個子類究竟能不能用collects.sort()進行排序呢。然而事實是子類也是可以進行排序的。那麼加上comparable又會怎麼樣呢?子類並不需要進行重寫。所以我認為子類與父類實現同一介面最大的意義就是讓使用者用起來更加的直觀,並沒有什麼其他的意義了。

    接下來將會對一些原始碼進行一波分析,基於自己已經學習過的一些知識。比如這裡我們會經常遇到 == 與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;
}

看了這段原始碼其實會發現 == 其實比較的是地址值。上面這段程式碼首先就會對地址值進行一次比較,然後呢才會對內容進行比較。對內容進行比較呢又是對內容的每個字元進行比較,只要有一個字元不相等就報錯。這也就是底層實現equals方法的原理了。

接下來就是我們對於String中常用的方法了比如說lastIndexof(),indesof(),endwith()等等這些常用的方法了,我自己覺得這些都沒什麼可說的,大家如果真的對這個感興趣就自己在開發的時候去看看吧。其實我覺得吧大家學習原始碼主要是學習那些特殊的東西,有特點的,特別的東西,所以像這些方法什麼的我就不詳細講了,比如說繼承和介面它究竟是怎麼去實現的。設計模式它是怎麼去使用的,它是怎麼去實現我們那些底層的東西的,比如說ArrayList底層是陣列,linkedList的底層是連結串列,這些東西究竟是怎麼去實現的對吧。總之呢,我現在的理解就是這樣。