Java面试题

String, StringBuffer, StringBuil

2020-07-17  本文已影响0人  fanderboy

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

上一篇下一篇

猜你喜欢

热点阅读