String,StringBuilder,StringBuffer区别

引:最近心情非常的不静,我知道自己需要沉下心去沉淀,慢慢来,小朋友。今天谈谈3个字符串类

String

查看String源码的时候,我们很容易看到
>
public final class String

从源码中对String的定义可以知道它是final类,这意味着她不可被继承,也不可被更改。而且总它的方法中也没有可以拼接字符串的函数。

StringBuilder

查看StringBuilder源码的时候,我们也可以看到这样的定义:
>
public final class StringBuilder
extends AbstractStringBuilder

我们发现他也是final类,但是它却又append()方法,这是为什么,我们找到它的append():

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

我们看到他的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;
}

我们终于找到他怎么又这个添加字符串的方法了。具体AbstractStringBuilder是怎么实现添加的就让想要了解的人继续往下看源码就好了。

对比string: 我们可以从日常编写的代码可以了解到,用String拼接由于每次都是新建一个对象所以效率自然是低的,所以在使用字符串拼接的时候还是用StringBuilder比较好,但是对于单个常量字符串来说还是String好,因为它是放在常量池里,读取速度比放在堆中的对象自然是要快很多。

StringBuffer

这又是一个什么鬼,继续看源码吧

public final class StringBuffer
extends AbstractStringBuilder

这个和StringBuilder一样也是final类,但是我们可以很清楚的看到也是继承了AbstractStringBuilder,也就是说它也有append()方法,但是我们可以它的append()方法。

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

我们看到它的append()方法加入了synchronized关键字,所以它是个线程安全的类

和StringBuilder的区别: 由于他是线程安全的,所以自然牺牲了效率,在操作速度上没有StringBuilder快。

总结:点点滴滴积累