Java的String为什么是常量字符串



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

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

    查看Jdk的源码一看就明白了。

 

public final class String
    implements java.io.Serializable, Comparable<String>, 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的源码

* @author Michael McCloskey
* @version 1.15, 11/17/05
* @since 1.5
*/
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;

/**
* This no-arg constructor is necessary for serialization of subclasses.
*/
AbstractStringBuilder() {
}

/**
* Creates an AbstractStringBuilder of the specified capacity.
*/
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

终于清楚了,value不是final的。当然可以扩展存储空间。