作者:ouyangyewei
個(gè)人站點(diǎn):http://ouyangyewei.me/
String類
String類是不可變類
下面代碼片段摘自java.lang.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
可見,String類使用final關(guān)鍵字修飾,是不可變類,因此不可被繼承;
字符串的內(nèi)存形態(tài)
String對(duì)象在內(nèi)存中使用不可變的char型數(shù)組來存放字符串,因此String對(duì)象在創(chuàng)建后,其值就不可被改變(對(duì)于修改已存在的String對(duì)象的值,實(shí)際上是會(huì)創(chuàng)建一個(gè)新的String對(duì)象,可參考java.lang.String.concat方法的實(shí)現(xiàn))
下面代碼摘自java.lang.String
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
下面代碼摘自java.util.Arrays
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}

String中的"+"操作符
引用String類的注釋
The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method. String conversions are implemented through the method toString, defined by Object and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, The Java Language Specification.
Java中,String的"+"操作符,是通過StringBuilder(或StringBuffer)類和它的append方法實(shí)現(xiàn)的,下面以一段代碼來證明:
public class Turtle {
public static void main(String[] args) {
String a = "a";
String b = "b";
String c = "c";
String d = a + b + c;
}
}
對(duì)應(yīng)的字節(jié)碼:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=5, args_size=1
0: ldc #2 // String a
2: astore_1
3: ldc #3 // String b
5: astore_2
6: ldc #4 // String c
8: astore_3
9: new #5 // class java/lang/StringBuilder
12: dup
13: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
16: aload_1
17: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: aload_2
21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: aload_3
25: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: astore 4
33: return
LocalVariableTable:
Start Length Slot Name Signature
0 34 0 args [Ljava/lang/String;
3 31 1 a Ljava/lang/String;
6 28 2 b Ljava/lang/String;
9 25 3 c Ljava/lang/String;
33 1 4 d Ljava/lang/String;
可見,"+"的操作,實(shí)際上會(huì)創(chuàng)建一個(gè)StringBuilder對(duì)象,先后調(diào)用append()方法,添加字符串"a","b","c",最后調(diào)用toString()方法返回一個(gè)String對(duì)象