一、String、StringBulider、StringBuffer区别
1、String(JDK1.0)是不可变字符序列
2、StringBuffer(JDK1.0)是可变字符序列,可以对内容进行增删,此时不会产生新的对象,效率低,线程安全
- StringBuffer有三个构造器
StringBuffer(); //初始容量为16的字符串缓冲区
StringBuffer(int size); //构造指定的初始容量
StirngBuffer(String str); //将内容初始化为指定的字符串内容
3、StringBuilder(JDK5.0)是可变字符序列,与StringBuilder类似,其中提供的相关功能也一样,效率高,线程不安全
4、在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
二、StringBuffer常用方法
StringBuffer append(xxx); //提供了很多的append方法,用于字符串拼接
StringBuffer delete(int start,int end); //删除指定位置的字符,左闭右开
StringBuffer replace(int start,int end,String str); //把[start,end)位置换成str,左闭右开
StringBuffer insert(int offset,xxx); //在指定位置插入xxx
StringBuffer reverse(); //把当前字符串序列逆转
- 特别的,当append和insert方法时,如果长度不够可扩容
- 支持方法链操作
三、一些其他的问题
今天再刷力扣题时看到这样一个题目
自己一开始写的方法:
class Solution {
public String replaceSpace(String s) {
int length = s.length();
if(s == null){
return null;
}
String a = "";
for(int i = 0;i<length;i++){
if(s.charAt(i)==' '){
a+="%20";
continue;
}
a+=s.charAt(i);
}
return a;
}
}
自己写了之后效率很低,看了一些题解和大佬的评论之后总结如下:
在Java for循环内部最好不要使用拼接字符串,否则每次循环都会重新new对象,对性能有一定的影响,虽然在jdk1.5已经优化了,但是jdk1.5+的优化好像是在每次循环体内 new 一个StringBuilder对象,再调用append方法,还是会产生垃圾对象,所以还是推荐在循环体外手动new 一个 StringBuilder对象。
不过经过测试确实是这样,对于拼接字符串来说
运行耗时大大增加,但是一开始对字符串进行操作时,最好使用StringBuilder类进行操作,以下是优化版
class Solution {
public String replaceSpace(String s) {
int length = s.length();
if(s == null){
return null;
}
StringBuilder string = new StringBuilder();
for(int i = 0;i<length;i++){
if(s.charAt(i)==' '){
string.append("%20");
continue;
}
string.append(s.charAt(i));
}
return string.toString();
}
}
这个题目还有另外一个简单的方法,也是一开始写的,已经有的轮子自己用罢了,但是面试的时候估计就让回去等通知了
class Solution {
public String replaceSpace(String s) {
int length = s.length();
if(s == null){
return null;
}
return s.replaceAll(" ","%20");
}
}
这个方法也是没问题的,不过耗时也高
题目链接