String,StringBuilder和StringBuffer
String:字符串常量
StringBuffer:字符串变量(
线程安全)
StringBuilder:字符串变量(非
线程安全)
拼接字符串时,性能比较,大多数情况下:StringBuilder > StringBuffer > String
StringBuilder和StringBuffer的主要作用?
实际
例子中用StringBuilder和StringBuffer主要是用于对字符串的拼接,因为String做字符串的拼接时,都是重新
创建对象。且String做拼接时,.
class文件是转成StringBuilder( )做处理的。
public static void main(String[] args) {
String string="hollis";
String string2 = string + "chuang";
}
//反编译后结果:
public static void main(String args[]){
String string = "hollis";
String string2 = (new StringBuilder(String.valueOf(string))).append("chuang").toString();
}
实际上字符串拼接底层是转成StringBuilder( )的
public class Test10 {
public static void main(String[] args) {
/**
* jvm做了优化,String a = "a"+"b"+"c";其实等于String a = "abc"。
* 再于StringBuilder和StringBuffer做性能比较的时候,不考虑该种情况。
*/
String a = "a"+"b"+"c";
/**
* 以下两种情况做对比,1的性能<2的性能<3的性能,因为String是不可变的,
* 1的情况每次jvm都需要创建新的对象,再进行处理。
* 2是线程安全的,多线程并发访问的时候会阻塞
* 3是非线程安全的效率高
*/
// 1
String b = "b";
String c = "c";
String d = "d";
String e = b + c + d;
// 2
StringBuffer f = new StringBuffer("b").append("c").append("d");
//3
StringBuilder g = new StringBuilder("b").append("c").append("d");
}
}
StringBuilder和StringBuffer的区别:
主要区别:StringBuffer是线程安全的,StringBuilder不是线程安全的。(即StringBuffer内的方法都是synchronized修饰的,因此拼接字符串效率:StringBuilder > StringBuffer )
StringBuffer是伴随着String出现的,StringBuilder是jdk1.5之后出现的。
那为什么会设计StringBuilder这个类呢?
StringBuffer做字符串的拼接的效率太低,且拼接的行为多存在于方法内部,不会引起线程安全的行为。因此做频繁字符串拼接的时候,应该考虑用StringBuilder( ),因为很少有场景适合使用线程安全的StringBuffer( )。