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