這篇文章帶給大家的內容是關於詳解使用javap分析Java的字串操作 ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
我們看這樣一行簡單的字串賦值運算的Java程式碼。
String a = "i042416";
使用命令列將包含了這行程式碼的Java類別反編譯查看其字節碼:
javap -v constant.ConstantFolding
#我們看到字串"i042416" 被Java編譯器加到了常數池裡。
Java程式碼String a = "i042416"被翻譯成了下面兩句字節碼:
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。
#因此,變數aa1和aa3實際上指向常數池中的同一個常數,因此直接用==比較也回傳true。
String aa1 = "i042416jerrywang"; String aa2 = "jerrywang"; String aa3 = "i042416" + "jerrywang"; System.out.println(aa1 == aa3);
以上是詳解使用javap分析Java的字串操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!