面试:一文搞懂String、StringBuilder、StringBuffer 区别

1、三者之间的区别

区别StringStringBuilderStringBuffer
【值】不可变可变可变
【效率 】最低最高中等
【线程】非线程安全非线程安全线程安全

不同点:StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象,而string类会产生新的对象。

2、String

String 是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,操作String很耗资源,所以性能最低。
在这里插入图片描述
通过源码可知:底层是一个由final修饰的字符串数组,这一点就验证了他的值不可变这一特性。

首先我们来看一个面试题:String str = new String(“abc”) 到底创建了几个对象?

首先String str是定义了一个字符串变量,并未产生对象,也就是不产生对象,那么只有后面的new String(“abc”)了才会产生对象。把它拆分成"abc"和new String(),首先在字符串常量池去寻找有没有"abc"这个字符串,没有就创建一个“abc”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用。所以一共产生两个对象

3、StringBuilder和StringBuffer

首先他们最本质的区别就是:StringBuilder线程安全、StringBuffer 非线程安全。

最明显的共同之处:字符串拼接直接在字符串后追加

那我们来看一下这两个的append方法源码:
在这里插入图片描述
在这里插入图片描述
StringBuffer之所以是线程安全的,我们从底层源码中可以看到该类被synchronized同步块修饰。

4、效率高低

效率高低也就是他们的运行速度,或者说是执行速度,在这方面运行速度从快到慢为:

StringBuilder > StringBuffer > String

public class School {

    public static void main(String[] args) {
        long a = new Date().getTime();
        String cc = "";
        int n = 10000;
        for (int i = 0; i < n; i++) {
            cc+="."+i;
        }
        System.out.println("String使用的时间"+(System.currentTimeMillis()-a)/1000.0+"s");

        long s1 = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append("."+i);
        }
        System.out.println("StringBuilder使用的时间"+(System.currentTimeMillis()-s1)/1000.0+"s");

        long s2=System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer();
        for (int i = 0; i < n; i++) {
            sbf.append("."+i);
        }
        System.out.println("StringBuffer使用的时间"+(System.currentTimeMillis()-s2)/1000.0+"s");
    }
}

在这里插入图片描述
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

5、什么场景下使用呢?

  • String:适用于少量的字符串操作的情况
  • StringBuffer:在多线程情况下操作大量的数据推荐使用
  • StringBuilder:在单线程情况下操作大量的数据推荐使用

最后

如果你觉得DT_小白文章写的还不错,请微信搜索并关注「 Java云社 」微信公众号,和DT_小白一起学习Java、分布式、微服务、大数据技术,并且「 Java云社 」收集了大量的大厂面试题目集,等你来挖掘,为了提升自己的能力,实现技术能力的飞跃,每天定时更新超硬核技术干货,我在「 Java云社 」等您的加入,让我们共同学习吧!

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DT辰白

你的鼓励是我创作的源泉

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

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

打赏作者

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

抵扣说明:

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

余额充值