使用java中彙編指令解析String對象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)

首先介紹一下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方式實現的最後返回

一個新創建的String對象而不是string常量。"a"+"b"等價於"ab",只是生成一個字符串常量,保存在棧中而String s2=s1+"b";保存在堆中。凡是字符串變量與字符串變量或者字符串常量之間使用+都會產生一個String對象到堆中,凡是String s="a"+"b";或者String s="ab";產生一個字符串常量在棧中。凡是在for循環中遇到字符串+操作的最好使用StringBuffer的append方法替代它,否則會因數據量過大而產生內存異常。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章