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() 按數據字典的順序進行比較
這裏非常感謝“直系學長”的指導和“璐兄”的校對,有問題歡迎來噴!有則改之,無則加勉。