String StringBuilder Stringbuffer
力扣剑指offer 05题
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:"We%20are%20happy.
同样是遍历替换,一开始我的解法:
class Solution {
public String replaceSpace(String s) {
String scanned = "";
for (int i = 0; i< s.length(); i++){
char index = s.charAt(i);
if (index == ' '){
scanned += "%20";
}else {
scanned += index;
}
}
return scanned;
}
}
看了题解,如下:
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for (Character c : s.toCharArray()){
if (c == ' ') res.append("%20");
else res.append(c);
}
return res.toString();
}
}
两个的效率还差挺多,原因是:
String是不可变字符串,它的底层是用一个final修饰的字符数组,所以按照我的写法,每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生(其底层是不用final修饰的字符数组)。每次连接不需要重建构建对象。
StringBuffer:效率略低,但是允许采用多线程的方式执行添加或者删除字符操作。
StringBuilder : 前身是StringBuffer, 只允许单线程编辑,效率较高