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

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

  • 面试题: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;

面试题:String和StringBuffer和StringBuilder的区别_第1张图片

题目回答

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

你可能感兴趣的:(面试,JAVA)