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的。当然可以扩展存储空间。