String,StringBuilder和StringBuffer

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

猜你喜欢

转载自834434471.iteye.com/blog/2412838