面试题:String为什么不可变?StringBuffer/StringBuilder为什么是可变的?

问题一:String为什么不可变?
错误回答:
   因为String类是被final修饰的,所以不可变。
   如果是这样回答的话,面试官就会想,因为String类是被final修饰,所以无法被继承。
正确回答应该是:
   String类,我看过源代码!Strinf类中有一个byte数组,并且这个byte数组是被final修饰的。因为数组一旦创建长度不可变。并且被final修饰的引用一旦指向某个对象之后,不可在指向其它对象,所以String是不可变的!

源代码:

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

问题二:StringBuffer/StringBuilder为什么是可变的?
    我看过源代码,StringBuffer/StringBuilder内部实际上是一个byte[ ]数组,这个byte数组没有被final修饰,StringBuffer和StringBulider的初始化容量应该为16,当存满之后会进行扩容,底层调用了数组拷贝的方法:System.arraycopy()…扩容的,所以StringBuffer/StringBuilder适用于字符串的频繁拼接操作,并且StringBuffer是线程安全的,StringBuilder是非线程安全的。
StringBuffer源代码:

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    **
     * Constructs a string buffer with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuffer() {
        super(16);
    }

StringBuilder源代码:

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    /** use serialVersionUID for interoperability */
    static final long serialVersionUID = 4383685877147921099L;

    /**
     * Constructs a string builder with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuilder() {
        super(16);
    }

你可能感兴趣的:(面试题,笔记)