面試String的特點及重要方法

大家好,最近呢本人也是在面試,順便記錄一些讓我們如何拿到高薪offer的經驗和技巧,在我個人覺得,想要面試官對你滿意,那就是關於一個問題,你能舉一反三甚至往更多,這就要求我們必須對源碼的掌握,你對源碼掌握的深度,才能更明顯的體現你到底是不是貨真價實,我只是做一些整理,希望能夠幫到需要的人。

幾乎所有的Java面試,都是String開始的,第一印象非常重要,所以對於String的知識,我們必須深入的掌握才能爲自己贏得更多的籌碼

1.String是如何實現的?

以主流的JDK1.8來說,String的內部存儲結構爲char數組 ,源碼如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    //用於存儲字符串的值
    private final char value[];
    //緩存字符串的hash code
    private int hash; // Default to 0
    //其他內容
    }

2.String常用有哪些構造方法?

①以String爲參數的構造方法

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

②以char[]爲參數的構造方法

public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

③以StringBuffer爲參數的構造方法

public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}

④以StringBiulder的構造方法

public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

其中我們比較忽略的是StringBuffer和StringBuilder爲參數構造方法,因爲三種數據類型,我們通常都是單獨使用,所以我們要注意一下這裏。

3.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;
}

String類型重寫了Object中的equals()方法,equals()方法需要傳遞一個Object類型的參數值,在比較時會先通過instanceof判斷是否爲String類型,如果不是的話則會直接返回false,當判斷參數爲String類型之後,會循環對比兩個字符串中的每個字符,當都一樣時返回true,否則返回false。
還有一個比較類似的方法equalslgnoreCase(),他是用來忽略字符串大小寫之後進行對比的。

3.compareTo比較兩個字符串

我們看源碼:

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;
}

可以看出,compareTo()方法會循環對比所有的字符,當兩個字符中有任意一個字符不同時,則return char1-char2。
比如兩個字符串分別存儲的是1和2,返回值是-1,如果存儲是1和1,則返回0,如果是2和1,則返回1。

還有一個類似的方法是compareTolgnoreCase(),用於忽略大小寫比較。

小結:
可以看出上面兩個方法都用於比較字符串,但他們的不同點:

  • equals()可以接收一個Object類型的參數,而compareTo()只能接收String的參數;
  • equals()返回值爲Boolean,而compareTo返回int;

他們都用於字符串比較,當equals返回true或者compareTo返回0時,則表示字符串完全相同。

4.其他重要方法

  • indexOf():查詢字符串首次出現的下標位置
  • lasIndexOf():查詢字符串最後出現的下標位置
  • contains():查詢字符串中是否包含另一個字符串
  • toLowerCase():把字符串全部轉換爲小寫
  • toUpperCase():把字符串全部轉換爲大寫
  • length():查詢字符串長度
  • trim():去掉字符串首尾空格
  • replace():替換字符串中某些字符
  • split():把字符串分割並且返回數組
  • join():把字符串數組轉換爲字符串

總結:String源碼屬於Java源碼中最基礎最基本的源碼,你對Java源碼的理解,側面可以反應了你是否熱愛和喜歡專研程序,也反應了你的Java功底,String的問題如果在延伸一下,會有更多的細節,通常關聯一下問題:

  • 爲什麼String用final修飾
  • ==和equals的區別
  • String,StringBuffer,StringBuilder的區別
  • String的intern()的真正含義
  • String類型在JVM(Java虛擬機)中如何存儲,編譯器對String做了哪些優化

帶着這些問題,我們下期再爛看看這些知識點的真正答案,我們,下期再會!下期鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章