面試官Q1:請問String常見的方法有哪些,列舉幾個?
String是我們開發中使用頻率最高的類,它有哪些方法,大家一定不會陌生,例如:
-
length();//計算字符串的長度
-
charAt();//截取一個字符
-
getChars();//截取多個字符
-
equals();//比較兩個字符串
-
equalsIgnoreCase();//比較兩個字符串,忽略大小寫
-
startsWith();//startsWith()方法決定是否以特定字符串開始
-
endWith();//方法決定是否以特定字符串結束
-
indexOf();//查找字符或者子串第一次出現的地方。
-
lastIndexOf();//查找字符或者子串是后一次出現的地方。
-
substring();//截取字符串
-
concat();//連接兩個字符串
-
replace();//替換
-
trim();//去掉起始和結尾的空格
-
valueOf();//轉換為字符串
-
toLowerCase();//轉換為小寫
-
toUpperCase();// 轉換為大寫
但是像replace(),substring(),toLowerCase()這三個方法需要注意一下,我們看下下面一段代碼:
import java.util.*; public class StringTest { public static void main(String[] args){ String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1', '0'); System.out.println("ss = " + ss); } }
打印結果:
ss = 123456
ss = 123456
如果你不了解replace方法的源碼,可能會認為最后的打印結果為 "ss = 023456",但是實際上方法內部創建了一個新的String對象,並將這個新的String對象返回。對ss是沒有做任何操作的,我們也知道String是不可變的嘛。源碼如下:
public String replace(char oldChar, char newChar) { // 判斷替換字符和被替換字符是否相同 if (oldChar != newChar) { int len = value.length; int i = -1; // 將源字符串轉換為字符數組 char[] val = value; /* avoid getfield opcode */ while (++i < len) { // 判斷第一次被替換字符串出現的位置 if (val[i] == oldChar) { break; } } // 從出現被替換字符位置沒有大於源字符串長度 if (i < len) { char buf[] = new char[len]; for (int j = 0; j < i; j++) { // 將源字符串,從出現被替換字符位置前的字符將其存放到字符串數組中 buf[j] = val[j]; } while (i < len) { char c = val[i]; // 開始進行比較;如果相同的字符串替換,如果不相同按原字符串 buf[i] = (c == oldChar) ? newChar : c; i++; } // 使用String的構造方法進行重新創建String return new String(buf, true); } } return this; }
方法內部最后重新創建新的String對象,並且返回這個新的對象,原來的對象是不會被改變的。substring(),toLowerCase()方法也是如此。
還有諸如contact()方法,源碼如下:
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }
從上可知參數str不能為null,否則就會包空指針異常。用contact()拼接字符串速度也很快,因為直接Arrays.copyOf,直接內存復制。
面試的時候,如果能對一些方法有自己的認識,看過底層源碼,對於面試官來說會有比較深刻的印象!