String、StringBuilder和StringBuffer的区别和用法

分别使用使用这三种来拼接字符串,对比各自损耗的时间:
经过测试:

package com.test;

public class Main{

    public static void main(String[] args){
        testString();
        testStringBuffer();
        testStringBuilder();
    }
    private static void testStringBuilder() {
        long begin = System.currentTimeMillis();
        StringBuilder str = new StringBuilder("");
        for (int i = 0; i < 30000; i++) {
            str.append(i);
        }
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("-------------StringBuilder性能快--------------");
        System.out.println(time);
    }
    private static void testStringBuffer() {
        long begin = System.currentTimeMillis();
        StringBuffer str = new StringBuffer("");
        for (int i = 0; i < 30000; i++) {
            str.append(i);
        }
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("------------StringBuffer安全的---------------");
        System.out.println(time);
    }
    //String 做做字符串拼接的时候,性能极低,每次拼接的时候对象改变
    public static void testString(){
        long begin = System.currentTimeMillis();
        String str = "";
/*      for (int i = 0; i < 30000; i++) {
            str += i;
        }*/
        for(Integer i =0; i< 30000; i++){
            str += i.toString();
        }
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("-----------String----------------");
        System.out.println(time);
    }
}

结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String。

String和StringBuilder以及StringBuffer的区别:
StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的。

唯一的区别(建议使用StringBuilder):
StringBuffer:StringBuffer中的方法都使用synchronized修饰符,表示同步的在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低。
StringBuilder:StringBuilder没有使用synchronized修饰符,不安全,但性能高。
StringBuilder sb = new StringBuilder ()等价于…new StringBuilder(16)(API可见..) 使用StringBUilder无参数的构造器,在底层创建一个长度为16的char数组:
char[] value = new char[16];
此时该数组只能存储16字符,如果超过了,得自动扩容:
自动扩容(创建长度更大得数组,再把之前得数组拷贝到新数组)
此时性能极低,一般得,我们事先知道大概需要存储多少字符,在构造器中就应该设置。

原文地址:https://www.cnblogs.com/treasure716/p/10019533.html