StringBuffer和StringBuilder 非常类似,均代表可变的字符序列。这两个类都是抽象类的,方法一模一样
StringBuffer线程安全,做线程同步检查,效率低
StringBuilder线程不安全,不做线程同步检查,效率较高,建议使用该类
StringBuilder的使用 速度对比:
package oop2.demo06;
public class StringF {
public static void main(String[] args) {
String str = "bnu";
StringBuilder builder = new StringBuilder();
long l = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
//str = str.concat("sxt");
//builder.append("sxt");
}
long l1 = System.currentTimeMillis();
System.out.println(l1-l); //查看运行的时间,用以对比StringBuilder 和String运行的速度
}
} 一些常用方法: package oop2.demo06;
public class StringG {
public static void main(String[] args) {
//String s = "bnu";
StringBuilder builder = new StringBuilder("bnu");
builder.append("北京师范大学"); //内容追加的方法 ,常用。
builder.insert(0,"BNU"); //指定的位置插入字符串。数组下标从0开始
char c = builder.charAt(2); //取出指定下标字符
builder.setCharAt(3,'J'); //设置指定位置的的字符
builder.replace(0,4,"北师大"); //进行指定位置的字符替换 [0,4)
builder.deleteCharAt(3); //删除指定位置字符
builder.delete(1,3); //删除多个字符 [1, 3)
builder.reverse(); //倒序输出字符串
System.out.println(builder);
System.out.println(c);
//String类型与 StringBuilder类 互转
String str = "bnu";
StringBuilder stringBuilder = new StringBuilder(str);
String s = stringBuilder.toString();
}
} 一些面试题 StringBuilder 底层默认char数组长度为16
StringBuilder 底层的扩容机制 是 : 原有的数组长度*2+2
package oop2.demo06;
public class StringL {
public static void main(String[] args) {
String str = "abcd";
String a = "a";
String b = "b";
String c = "c";
String d = "d";
//字符串拼接的时候,如果全部是常量 ,和直接写一个结果的含义是一样的
String str2 = "a" + "b" + "c" + "d"; //创建了几个对象? 1个
String str3 = a+b+c+d; //创建了1个对象
//只要含有变量的连接,采用的就是优化的机制:
StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
builder.append(c);
builder.append(d);
System.out.println(str==str2); //true
System.out.println(str2==str3); //false
}
}