题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
时间限制:1秒 空间限制:32768K
本题知识点: 字符串
代码实现
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str == null){
return null;
}
for(int i = 0; i < str.length(); i++){
if(str.charAt(i) == ' '){
str.replace(i, i + 1, "%20");
}
}
return str.toString();
}
}
解题思路
这个题比较简单,很容易就能完成。
延伸问题
StringBuffer、StringBuilder、String 有什么不同?
通过看源码我们可以发现 String 类是使用 final 修饰的数组来储存字符串的,所以 String 对象是不可变的。而另外两个是继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 类中也使用数组来储存字符串,但是没有 final 关键字,所以 StringBuffer 和 StringBuilder 对象是可变的。
String 的对象是不可变的,也可以理解为常量,所以是线程安全的。StringBuffer 对方法或者调用的方法加了同步锁,所以也是线程安全的。StringBuilder 没有加锁,所以是非线程安全的。
每次对 String 对象进行改变时,都会生成一个新的对象,然后把指针指向新的 String 对象。StringBuffer 和 StringBuilder 都是对象本身进行操作,使用 Stringbuilder 比 StringBuffer 的性能高 10%~15% 左右,但是有线程不安全的风险。
最后总结为:
- 操作少量的数据: 适用String
- 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer
欢迎关注公众号:「努力给自己看」