Java中StringBuffer和StringBuilder的用法和区别
区别:StringBuffer类中的方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行是安全的。StringBuilder类中的方法无synchronized关键字修饰,表示StringBuffer在多线程环境下运行是不安全的。用法:由于Java中的string类的对象是不可变的(被final修饰),在做字符串的的拼接删除时会耗费极大空间,所以Java中又提
·
区别:
StringBuffer类中的方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行是安全的。
StringBuilder类中的方法无synchronized关键字修饰,表示StringBuffer在多线程环境下运行是不安全的。
用法:
由于Java中的string类的对象是不可变的(被final修饰),在做字符串的的拼接删除时会耗费极大空间,所以Java中又提供了StringBuffer和StringBuilder类,其对象是可以改变大小的,默认容量是16,超过会自动扩容。扩容会损耗性能,一般声明最好给出预先估计的大小。
/*
* Java中字符串是不可变的,每一次拼接会产生新字符串,这样会占用大量内存
* String s="abc";
* s+="hello";
* 以上两行代码会在方法区的字符串常量池中产生三个对象:"abc", "hello","abchello"
* */
public class StringBufferTest01 {
public static void main(String[] args) {
String s="";
//字符串常量池会有很大的压力
for (int i = 0; i <100 ; i++) {
s+=i; //每执行一次,都会在方法区的字符串常量池中产生新的对象,浪费空间
}
}
}
public class StringBufferTest02 {
public static void main(String[] args) {
//创建一个容量为16的byte[]数组(字符串缓冲区对象)
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("a");
stringBuffer.append("b");
stringBuffer.append("cd");
stringBuffer.append(100);
stringBuffer.append(true);
//append()方法在追加的时候,如果byte[]数组满了会自动扩容
//在创建StringBuffer的时候尽可能给定一个初始化容量,尽可能的减少底层数组的扩容次数
System.out.println(stringBuffer);
}
}
public class StringBuilderTest01 {
public static void main(String[] args) {
StringBuffer sb =new StringBuffer();
sb.append(100);
sb.append(true);
sb.append("hello");
System.out.println(sb);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)