【面试篇】Java中String、StringBuilder与StringBuffer的区别?

【面试篇】Java中String、StringBuilder与StringBuffer的区别?

每天进步一点点!
在这里插入图片描述

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。但String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。

因此引进了两个新的类-StringBuffer类和StringBuilder类来对这种变化的字符串进行处理。

与String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用的对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmahz15s-1606403306809)(C:\Users\lcz\AppData\Roaming\Typora\typora-user-images\image-20201126225133604.png)]

  • String:不可变的字符串序列
  • StringBuffer:可变的字符串序列、线程安全效率低
  • StringBuilder:可变的字符串序列、线程不安全效率高

补充知识:字符串的拼接操作

1: “+” 号操作符

String s1 = "hello";
String s2 = "world";
System.out.println(s1 + s2);

但实际上在编译的时候“+”是被替换成了StringBuilder里面的append方法。即

System.out.println((new StringBuilder(String.valueOf(s1))).append(s2).toString());

2: StringBuilder

StringBuilder中的append方法就是常用的字符串拼接方法。

SpringBuilder类中的append方法源码如下:

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

这 3 行代码没啥可看的,可看的是父类 AbstractStringBuilder 的 append 方法:

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
123456789

1)判断拼接的字符串是不是 null,如果是,当做字符串“null”来处理。appendNull 方法的源码如下:

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}
1234567891011

2)拼接后的字符数组长度是否超过当前值,如果超过,进行扩容并复制。ensureCapacityInternal 方法的源码如下:

private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0) {
        value = Arrays.copyOf(value,
                newCapacity(minimumCapacity));
    }
}

3)将拼接的字符串 str 复制到目标数组 value 中。

str.getChars(0, len, value, count);

3.StringBuffer

StringBuffer相比较StringBuilder区别在于线程安全。

public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

StringBuffer 类的 append 方法比 StringBuilder 多了一个关键字 synchronized。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页