Java中的String为什么是常量字符串(即不可变)

     String和StringBuffer有何不同?相信做Java的伙伴们应该大多被面试过这道题,String是字符串常量类,StringBuffer是可变的。

    为什么String是不可变的(即常量)呢?

    打开Jdk的源码一看就明白了。

 

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

 

    value是一个final修饰的char数组,final修饰的。这就意味着value在构造器中被初始化后,无法再被修改了。

   为什么说StringBuffer是可变的呢?

    先不管其他的,看源码。

   

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

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    static final long serialVersionUID = 3388685877147921107L;

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

 

   StringBuffer继承了AbstractStringBuilder类。接着看AbstractStringBuilder的源码

 

 

 1 * @author    Michael McCloskey
 2  * @version     1.15, 11/17/05
 3  * @since    1.5
 4  */
 5 abstract class AbstractStringBuilder implements Appendable, CharSequence {
 6     /**
 7      * The value is used for character storage.
 8      */
 9     char value[];
10 
11     /** 
12      * The count is the number of characters used.
13      */
14     int count;
15 
16     /** 
17      * This no-arg constructor is necessary for serialization of subclasses.
18      */
19     AbstractStringBuilder() {
20     }
21 
22     /** 
23      * Creates an AbstractStringBuilder of the specified capacity.
24      */
25     AbstractStringBuilder(int capacity) {
26         value = new char[capacity];
27     }

 

    一目了然了,value不是final的。当然可以扩展存储空间。

     

 

 

转载于:https://www.cnblogs.com/lingxiasandu/p/String.html

你可能感兴趣的:(Java中的String为什么是常量字符串(即不可变))