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 } }