String的常見面試題

1.String可以被繼承嗎?如果不可以,請說出原因。

不可以,String類被final關鍵字修飾。final關鍵字修飾的類不可以被繼承,final修飾的方法不可以重寫(覆蓋),final修飾的屬性不可以改變。這裏多說一句,final修飾的屬性如果是基本數據類型,那麼值不能改變;如果修飾的是引用數據類型,那麼引用(指針)不能改變。

2.String,StringBuffer和StringBuilder的區別。

String是字符串常量,創建之後不可以修改;StringBuffer和StringBuilder是字符串變量,創建之後可以修改。所以拼接字符串較多的場景下應該儘量使用Buffer和Builder,因爲String更耗費內存。StringBuffer和StringBUilder的區別主要是線程是否安全,前者線程安全,效率低下;後者線程不安全,效率較高。二者的方法基本一樣,不過Buffer的方法有synchronized關鍵字修飾。如果不考慮線程安全的問題,建議使用Builder。

3.String直接賦值和構造器創建對象的區別。

直接賦值更節約內存。首先去常量池尋找是否有該字符串,如果有,直接引用,如果沒有,先在常量池創建該對象,然後再進行引用;構造器創建對象,直接去堆內存中創建該對象,然後進行引用,同時也會在常量池中創建對象,如果再new一個相同內容的字符串,那麼會再次在堆內存中進行創建,而常量池不會再去創建,也就是說每次都會新創建對象,至少進行一次,所以會耗費一些內存。

4.String s1=null;和String s2=" ";的區別。

前者是空對象,聲明並進行初始化,但是引用沒有進行指向,也沒有申請內存資源。本質上不是字符串,所以調用字符串的方法會出現空指針異常;後者是空字符串,存在常量池中,可以調用字符串的方法。

5.判斷String的內容是否相等用什麼方法?雙等爲什麼不行?

equals方法。重寫了父類object的equals方法,又添加了幾種情況。父類的equals方法對兩個對象進行比較,如果是同一個對象返回true。String的equals方法在此基礎上考慮了對象是否是字符串類型,如果是,先比較length,長度相同則比較每個字符,畢竟是char數組,每個字符都相同則返回true,否則返回false。如果length不同直接或者不是String類型那麼直接返回false。

雙等用於比較對象是否相同,因爲String是引用類型,所以比較的是引用,如果是構造器創建的兩個相同內容的對象,它返回的也是false。不適用該場景。

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

6.請列舉一些String的方法。

length() 查看長度

hashCode() 查看哈希碼

equals() 判斷內容是否相等

split() 根據字符進行分割

idnexOf() 查看字符第一次出現的位置

concat() 拼接字符串到尾部

charAt() 返回字符出現的位置

replace() 替換字符

compareTo() 按數據字典的順序進行比較

這裏非常感謝“直系學長”的指導和“璐兄”的校對,有問題歡迎來噴!有則改之,無則加勉。

發佈了26 篇原創文章 · 獲贊 3 · 訪問量 3879
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章