首頁  >  文章  >  Java  >  詳解使用javap分析Java的字串操作

詳解使用javap分析Java的字串操作

不言
不言轉載
2018-10-22 15:23:262050瀏覽

這篇文章帶給大家的內容是關於詳解使用javap分析Java的字串操作 ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

我們看這樣一行簡單的字串賦值運算的Java程式碼。

String a = "i042416";

使用命令列將包含了這行程式碼的Java類別反編譯查看其字節碼:

javap -v constant.ConstantFolding

詳解使用javap分析Java的字串操作

#我們看到字串"i042416" 被Java編譯器加到了常數池裡。

詳解使用javap分析Java的字串操作

Java程式碼String a = "i042416"被翻譯成了下面兩句字節碼:

詳解使用javap分析Java的字串操作

ldc #16: 首先JVM底層的原生方法StringTable::intern被調用,產生String的內部儲存實作char[]。然後執行ldc #16, 將常數池內的代號為#16的常數載入到堆疊上,即i042416。

2. astore_1:將"i042416"的引用儲存到序號為1的本地變數中(即我們程式碼中的局部變數a)。

下面再看一個稍微複雜一點的例子。

做一個字串拼接的操作。

String aa1 = "i042416";
String aa2 = "jerrywang";
String aa3 = "i042416" + "jerrywang";

可以看到,在編譯階段,編譯器位元組把兩個字串常數的值進行拼接,結果"i042416jerrywang"儲存到變數aa3中, 作為一個新的字串常數, 在常數池中代號為#21。

詳解使用javap分析Java的字串操作

詳解使用javap分析Java的字串操作

#因此,變數aa1和aa3實際上指向常數池中的同一個常數,因此直接用==比較也回傳true。

String aa1 = "i042416jerrywang";
String aa2 = "jerrywang";
String aa3 = "i042416" + "jerrywang";
System.out.println(aa1 == aa3);

詳解使用javap分析Java的字串操作

以上是詳解使用javap分析Java的字串操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除