String、StringBuffer、StringBuilder的区别

String


String不可变,StringBuffer、StringBuilder可变,还有什么区别?

String:查源码,类的声明是:public final,清楚的知道,fianl是不可改变的。
但是操作字符串的时候,你感觉字符串变长了(改变?)原理是这样的:

String name1 = "Luoce";
String name2 = name1 + " Jack";

字符串变?错!
字符串对象的内容是无法更改的!

反编译这段程序,运行机制其实是:
String s = "Luoce";
String s1 = (new StringBuilder().append(s).append(" Jack").toString());
 一旦我们字符串的值改变,内存创建一个新的字符串对象,原来的对象就会变为垃圾被GC回收掉,
非常复杂操作来进行的String拼接


StringBuffer、StringBuilder的区别

所以,涉及到字符串操作的,我们一般使用StringBuffer或者StringBuilder,两者有什么区别
StringBuffer和StringBuilder都集成了AbstractStringBuilder,
而StringBuffer大部分方法都是synchronized,线程安全,
但是StringBuilder没有,线程不安全。

而且因为线程安全的提升,牺牲的运行速度。因为StringBuffer要维持同步锁,这肯定要消耗部分资源。

总结

    运行速度:StringBuilder >  StringBuffer  >  String
    Stirng:不可变
    StringBuffer线程不安全,StringBuffer线程安全

写个Demo测试速度差异

package demo;

/**
 * String、StringBuffer、StringBuilder速度测试比较
 * @author SYFC
 */
public class StringStringBufferStringBuilderTest {

    /**
     * string速度
     */
    public void stringTest(){
        long startTime = System.currentTimeMillis();
        String str = null;
        for (int i = 0; i < 20000; i++) {
            str = str + i +",";
        }
        System.out.println(System.currentTimeMillis()-startTime);
    }

    /**
     * StringBuffer速度
     */
    public void stringBuffer(){
        long startTime = System.currentTimeMillis();
        StringBuffer strBuffer = new StringBuffer();
        for (int i = 0; i < 20000; i++) {
            strBuffer.append(i+",");
        }
        System.out.println(System.currentTimeMillis()  - startTime);
    }

    /**
     * StringBuilder速度
     */
    public void stringBuilder(){
        long startTime = System.currentTimeMillis();
        StringBuilder strBuilder = new StringBuilder();
        for (int i = 0; i < 20000; i++) {
            strBuilder.append(i+",");
        }
        System.out.println(System.currentTimeMillis()-startTime);
    }

    /**
     * 测试
     */
    public static void main(String[] args) {
        StringStringBufferStringBuilderTest test = new StringStringBufferStringBuilderTest();

        test.stringTest();
        test.stringBuffer();
        test.stringBuilder();
    }
}

结果:
1033
5
3
上一篇:图像识别项目 // 视觉训练营 DAY5


下一篇:用远线程实现文件自删除