Java中String、StringBuilder和StringBuffer三者之间的区别

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

在我们使用Java的过程中,经常会进行对字符串的一个操作,那么我们看一下java中操作字符串都有那些类,它们之间有什么区别?

三种类
  • String
  • StringBuffer
  • StringBuilder
区别

StringStringBuilderStringBuffer的区别? Stringfinal修饰的,不可变,每次对String类型进行修改时,都会产生新的String对象,内存浪费比较大。因为不可变所以线程安全。

StringBuilder可变字符串 方法中没有同步锁所以是非线程安全的 可以直接在字符串对象本身上进行操作。

StringBuffer可变字符串 对其中的方法或者调用的方法加了同步锁所以是线程安全的 可以直接在字符串对象本身上进行操作。

性能:StringBuilder>StringBuffer>String

选择

字符串少量修改:String

单线程频繁修改字符串:StringBuilder

多线程使用共享变量时使用StringBuffer

下面通过代码看一下三者对于字符串拼接所体现出来的效率问题 代码如下

public class stringq {

    public static void main(String[] args) {
        StringTest(10000);
        StringBufferTest(10000);
        StringBuilderTest(10000);
    }
    public static void StringTest(int n){
        String str = "";
        Long startTime = System.currentTimeMillis();
        for(int i=0;i<n;i++){
            str += i;
        }
        Long endTime = System.currentTimeMillis();
        System.out.println("String 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
    }
    public static void StringBufferTest(int n){
        StringBuffer str = new StringBuffer();
        Long startTime = System.currentTimeMillis();
        for(int i=0;i<n;i++){
            str.append(i);
        }
        Long endTime = System.currentTimeMillis();
        System.out.println("StringBuffer 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
    }
    public static void StringBuilderTest(int n){
        StringBuilder str = new StringBuilder();
        Long startTime = System.currentTimeMillis();
        for(int i=0;i<n;i++){
            str.append(i);
        }
        Long endTime = System.currentTimeMillis();
        System.out.println("StringBuilder 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
    }

}

image.png

  我们可以清楚的看到String的字符串的连接效率是最低的,这一点对于大量字符串的拼接可以很明显的表示出来,所以说大量字符串的拼接最好不要选择StringStringBufferStringBuilder对于字符串的拼接效率是大致相同的。