关于这个问题,很多人会回答“StringBuilder是可变字符序列,String是不可变字符序列”,然而一般这种问题面试官都想要聊更深层次的不同,这里我来简单介绍一下:
JDK1.7下String成员变量的源码是这样的:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
String方法中有两个成员变量:value和hash,可以看到value是由final修饰的,并且value是字节数组,所以说String不可变。
java中为String提供了一个特殊的支持,比如说String s1 = "a";String s2 = "b";当执行String s3 = a+b的时候,其实是创建了一个StringBuilder对象,然后调用了StringBuilder中的append()方法将a与b进行拼接,最后通过toString()生成一个新的对象再赋给s3。