StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer。
工作原理 StringBuffer的底层是char数组,如果没有明确设定,则系统会默认创建一个长度为16的char类型数组,在使用时如果数组容量不够了,则会通过数组的拷贝对数组进行扩容,所以在使用StringBuffer时最好预测并手动初始化长度,这样能够减少数组的拷贝,从而提高效率。String与StringBuffer的区别?
String是不可变字符序列,存储在字符串常量池中 StringBuffer的底层是char数组,系统会对该数组进行扩容package com.monkey1024.string;public class StringBufferTest01 { public static void main(String[] args) { //构造方法 StringBuffer sb1 = new StringBuffer(); //StringBuffer的初始容量 System.out.println(sb1.capacity()); //手动指定StringBuffer的长度 StringBuffer sb2 = new StringBuffer(100); System.out.println(sb2.capacity()); StringBuffer sb3 = new StringBuffer("monkey"); System.out.println(sb3.capacity());//字符串的length + 16 }}
如何使用StringBuffer进行字符串拼接?
package com.monkey1024.string;public class StringBufferTest02 { public static void main(String[] args) { StringBuffer sb = new StringBuffer(30); //调用append方法进行字符串拼接 sb.append("www"); sb.append("."); sb.append("monkey1024"); sb.append("."); sb.append("com"); System.out.println(sb);//自动调用其toString方法 //System.out.println(sb.toString()); sb.insert(4, "1024");//在指定位置插入字符串 System.out.println(sb); sb.delete(4, 8);//删除指定位置的字符串 System.out.println(sb); }}
String作为参数传递的问题
基本数据类型的值传递,不改变其值
引用数据类型的值传递,改变其值String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的
package com.monkey1024.string;public class StringBufferTest03 { public static void main(String[] args) { String s = "String"; System.out.println(s); change(s); System.out.println(s);//值没有改变 System.out.println("---------------------"); StringBuffer sb = new StringBuffer(); sb.append("StringBuffer"); System.out.println(sb); change(sb); System.out.println(sb); } public static void change(StringBuffer sb) { sb.append("java"); } public static void change(String s) { s += "java"; }}
StringBuilder和StringBuffer的区别
通过API可以看到StringBuilder和StringBuffer里面的方法是一样的,那他们有什么区别呢? StringBuffer是jdk1.0版本中加入的,是线程安全的,效率低 StringBuilder是jdk5版本加入的,是线程不安全的,效率高