String、StringBuffer、StringBuilderr的区别

本文详细比较了Java中String、StringBuffer和StringBuilder的可变性、线程安全性、性能以及存储方式,强调了String的不可变性导致的性能较低,而StringBuilder在大多数情况下优于StringBuffer,因为其无同步锁且占用堆内存。
摘要由CSDN通过智能技术生成

1.可变性

​​ String:不可变

StringBuffer:可变

StringBuilder:可变

 String:内容不可变,

因为底层的value是使用final修饰的,final修饰则不可以被继承,所以String是一个不可变的类,每次修改String值的时候,都会创建一个新的对象

    private final char[] value;

StringBuffer和StringBuilder:内容可变,

底层的value就是char [ ],StringBuffer和StringBuilder是可变的类,每次String的值变更时不会产生新的对象

  char[] value;

2.安全性

String:线程安全

StringBuffer:线程安全

StringBuilder:线程不安全

 String是一个不可变的类,所以是线程安全的;

StringBuffer类的每一个操作方法里都用了一个synchronized,这是一个同步关键字,所以是线程安全的;

StringBuilder不是线程安全的

3.性能

一般情况:String < StringBuffer < StringBuilder

 String性能最低,因为String类不可变,每次对字符串操作(拼接、修改…)的时候都需要创建新的对象,分配新的内存;

当你定义一个String时,对象放到堆里面;

String str = "hello";

当你对String进行操作时,此时其实是在new一个新的String对象 ,放入jvm的堆里面,同时通过让jvm将原本堆中的对象清理掉;

 str += " world";
 String str=new String("hello world");

而StringBuffer和StringBuilder的性能都要比String的性能高,因为StringBuffer类和StringBuilder类都是可变的,字符串的值都可以直接被修改;

其中StringBuilder性能要比StringBuffer性能高一点,因为StringBuffer加了同步锁

可以通过实际的代码的运行比较String、StringBuffer、StringBuilderr的性能:

package training;

public class testSSS {

    public static void main(String[] args) {
        int n = 100000;
        long t1 = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < n; i++) {
            str += "hello-" + i;
        }
        System.out.println("t1:" + (System.currentTimeMillis() - t1));

        long t2 = System.currentTimeMillis();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < n; i++) {
            stringBuffer.append("hello-" + i);
        }
        System.out.println("t2:" + (System.currentTimeMillis() - t2));


        long t3 = System.currentTimeMillis();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < n; i++) {
            stringBuilder.append("hello-" + i);
        }
        System.out.println("t3:" + (System.currentTimeMillis() - t3));

    }

}

运行结果

 扩大n为10000000,单独测试StringBuffer和StringBuilder的性能

package training;

public class testSSS {

    public static void main(String[] args) {
        int n = 10000000;
//        long t1 = System.currentTimeMillis();
//        String str = "";
//        for (int i = 0; i < n; i++) {
//            str += "hello-" + i;
//        }
//        System.out.println("t1:" + (System.currentTimeMillis() - t1));

        long t2 = System.currentTimeMillis();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < n; i++) {
            stringBuffer.append("hello-" + i);
        }
        System.out.println("t2:" + (System.currentTimeMillis() - t2));


        long t3 = System.currentTimeMillis();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < n; i++) {
            stringBuilder.append("hello-" + i);
        }
        System.out.println("t3:" + (System.currentTimeMillis() - t3));

    }

}

运行结果 

4.存储方面

String存储在字符串常量池里面

而StringBuffer和StringBuilder存储在堆内存空间

5.补充

而StringBuffer和StringBuilder都是派生自AbstractStringBuilder抽象类

这个可以通过而StringBuffer类或StringBuilder类点击进入查看

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-有风无风皆自由-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值