大家好,最近呢本人也是在面試,順便記錄一些讓我們如何拿到高薪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做了哪些優化
帶着這些問題,我們下期再爛看看這些知識點的真正答案,我們,下期再會!下期鏈接