面试题:String和StringBuffer和StringBuilder的区别

26 篇文章 4 订阅

面试题:String和StringBuffer和StringBuilder的区别

面试题:String和StringBuffer和StringBuilder的区别

题目分析

StringBufferStringBuilder是两个极为相似的两个类,它们都是可变的字符串。可以通过查看源码可知,它们的继承的类,实现的接口都是一样的。这两个类在实现上不同的地方基本有两点:

  1. StringBuffer在很多方法上加上了关键字synchronized,而StringBuilder没有。
  2. StringBuffer新增了一个变量toStringCache,变量toStringCachetoString返回的最后一个值的缓存,每当修改StringBuffer时清除。

除这两点之外,StringBufferStringBuilder基本上是一致的,它们的大部分的实现都在于AbstractStringBuilder这个类上。

对于String类,我们将String类的部分源码摘取如下:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    /** 该值用于字符存储。 */
    private final char value[];

源码中,使用final关键字修饰了String类和value变量,所以,String类是不可继承的。String所表示的字符串,底层是使用一个字符数组来保存的,也就是value这个变量,此时这个变量也使用final修饰,表示String的表示的字符串是不可变的。所以,每次对 String 变量进行修改的时候其实都等同于生成了一个新的 String 对象。
String 对象的字符串拼接其实是被 JVM 解释成了 StringBuilder对象的拼接,以下面代码为例,下图即是被编译后的字节码,可以看出来String变量的相加其实被翻译成StringBuilderappend方法进行操作。

        String x = "abc";
        String y = "abc";
        String z = x + y + y + y;

在这里插入图片描述

题目回答

  1. String变量不可修改,StringBufferStringBuilder可以修改
  2. StringBuffer是线程安全的,StringBuilder不是线程安全的。
  3. StringBuffer使用了缓存区,StringBuilder没有使用缓存区,所以没有修改数据的情况下,多次调用StringBuffertoString方法获取的字符串是共享底层的字符数组的。而StringBuilder不是共享底层数组的,每次都生成了新的字符数组。
  4. 因为方法被上锁,所以StringBuffer的性能一般会比StringBuilder差,单线程中建议使用StringBuilder
  5. String对象的相加底层调用的是StringBuilder对象,分别调用了append方法和toString方法,所以在大量字符串相加时,使用String对象相加效率低于使用StringBufferStringBuilder,因为还有有StringBuilder对象的创建过程和toString方法中字符数组的拷贝过程。
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值