String, StringBuffer, StringBuilder的区别是什么?

String:不可变
StringBuffer:可变的,线程安全
StringBuilder:可变的,线程不安全

可变性:
String类使用Final关键字字符数组保存字符串,private final char[] value,所以String是不可变的;
StringBuffer 和 StringBuilder 都是继承自AbstractStringBuilder,而AbstractStringBuilder 也是使用使用字符数组保护字符串,不过没有final关键字,char[] value,所以后两者是可变的。
String:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

AbstractStringBuilder :

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

线程安全:
String因为是不可变,也可理解为常量,因此是线程安全的。而StringBuffer 和 StringBuilder 继承自AbstractStringBuilder,而AbstractStringBuilder定义了一些基本字符操作,如append、insert、indexOf等,在StringBuffer的方法中加了同步锁,因此StringBuffer是线程安全的。而StringBuilder没有相应的锁,所以非线程安全。
性能:
String类型进行改变都是创建新的字符串代替旧的,而后两者都是在自身改变,所以性能要好于String。而StringBuilder因为没有加同步锁,所以性能略优于StringBuffer,但是会有线程不安全的风险

总结:
操作量少:String

单线程操作量大:StringBuilder

多线程操作量大:StringBuffer

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容