java 字符串操作相關知識。
java字符串操作作爲最常見的面試題之一,也是一個程序員基本功的考察之一。本文藉着牛客網的刷題過程,討論一下java中的字符串處理相關知識。
字符串處理通常涉及三個對象:String、StringBuffer、StringBulid
String:在java中是一個最終類,不可以被繼承的。String在拼接的過程實際上是通過StringBuffer或者StringBulid實現的。
StringBuffer和StringBulid是動態字符串,區別就是前者是線程安全的,後者是線程不安全的。所以StringBulid的執行速度和效率都要高於前者。
上面是一個大致的總結,下面給出具體的編程題目:
題目描述
請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
這裏需要注意的特殊情況是:字符串首位有空格、字符串全是空格的特殊情況。
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("he is");
System.out.println(replaceSpace1(sb));
StringBuffer sb1 = new StringBuffer();
sb1.append("he is");
System.out.println(replaceSpace1(sb1));
}
public static String replaceSpace(StringBuffer str) {
String[] strArr = str.toString().split(" ");
int length = strArr.length;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < strArr.length; i++) {
if (strArr[0] == " ") {
sb.append("%20");
}
if (i == length - 1) {
sb.append(strArr[i]);
} else {
sb.append(strArr[i]).append("%20");
}
}
if (str.toString().endsWith(" ")) {
sb.append("%20");
}
return sb.toString();
}
public static String replaceSpace1(StringBuffer str) {
if (str == null) {
return null;
}
StringBuilder newStr = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ') {
newStr.append("%20");
} else {
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
}
上面的 replaceSpace1方法是參考的別人的實現代碼。
上面的 replaceSpace 方法是我自己在牛客網實現的(通過率是87.5%)。不通過的情況有下面兩種情況:1. 字符串中僅僅是有多個空格組成的
2. 字符串的末尾空格數大於1
之所以出現上面的情況就在String的split()方法出現問題。
下面給出實際的測試代碼:
public class TestSplit {
public static void main(String[] args) {
//三個空格組成的字符串
String str1 = " ";
//末尾含有兩個空格的字符串
String str2 = "hello world ";
String[] str1Arr = str1.split(" ");
String[] str2Arr = str2.split(" ");
System.out.println("str1Arr.length = " + str1Arr.length);
System.out.println("str2Arr.length = " + str2Arr.length);
}
}
輸出的結果:這就是問題所在: String的split()函數,在對字符串切分時,會忽略最後出現的空字符串。
雖然這到題目挺low,但是確實學會了很多細節知識。用正則表達式兩行代碼就可以搞定。不足和錯誤之處還望指正