首先介紹一下java方法執行過程:java的方法都是運行在線程的棧中,一個線程擁有一個執行棧,一個執行棧包含多個棧幀,一個方法對應一個棧幀,一個棧幀包含一個局部變量區(局部變量存儲區域)和一個操作數棧區(用於運算或者其他的操作),當一個方法要執行時先會創建一個方法棧幀當方法執行完之後線程銷燬棧幀。
public void show()
{
String s1="a";
//LDC "a" 加載字符串常量"a"到操作數棧
//ASTORE 1 保存字符串常量"a"到變量s1
String s2=s1+"b";//這裏調用StringBuffer操作並創建一個String對象
//NEW java/lang/StringBuffer 創建StringBuffer對象
// DUP 複製StringBuffer對象
// ALOAD 1 加載字符變量s1到操作數棧
// INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;調用String的靜態方法valueOf
// INVOKESPECIAL java/lang/StringBuffer.<init> (Ljava/lang/String;)V 調用StringBuffer的構造函數
// LDC "b"加載字符串常量“b”到操作數棧
// INVOKEVIRTUAL java/lang/StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer;調用SringBuffer的append方法追加字符串“b”
// INVOKEVIRTUAL java/lang/StringBuffer.toString ()Ljava/lang/String;調用StringBuffer的toString方法
// ASTORE 2保存字符串對象到s2變量中
String s3=new String("ab");
//NEW java/lang/String創建String對象
// DUP複製String對象
// LDC "ab"加載字符串常量到操作數棧
// INVOKESPECIAL java/lang/String.<init> (Ljava/lang/String;)V調用String的構造函數
// ASTORE 3保存String對象到變量s3中
String s4=s3+"c";//這裏調用StringBuffer操作並創建一個String對象
//NEW java/lang/StringBuffer創建StirngBuffer對象
// DUP複製StringBuffer對象
// ALOAD 3加載變量s3
// INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;調用String的靜態方法valueOf
// INVOKESPECIAL java/lang/StringBuffer.<init> (Ljava/lang/String;)V調用StringBuffer的構造函數
// LDC "c"加載字符串常量到操作數棧
// INVOKEVIRTUAL java/lang/StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer;調用SringBuffer的append方法追加字符串“c”
// INVOKEVIRTUAL java/lang/StringBuffer.toString ()Ljava/lang/String;調用StringBuffer的toString方法
// ASTORE 4保存字符串對象到s4變量中
System.out.println("ab"==s2);//結果是false,"ab"是字符串常量而s2是String在堆中的對象所以爲false
System.out.println(s2+"c"==s4);//結果是false,s2+"c"將產生一個String對象到堆中而s4本身是堆中的一個對象,所以兩個對象比較爲false
}
通過以上的class指令分析知道:String s2=s1+"b";//是調用stringBuffer操作並創建一個String對象也就是說+操作符使用StringBuffer的append方式實現的最後返回