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( )。