從基本結構到Java 7新特性(11)

發表于:2013-01-05來源:ImportNew作者:朱偉杰點擊數: 標簽:java
在#5和#8字節處,首先是調用了hashCode()方法,然后它作為參數調用了switch(int)。在lookupswitch的指令里,根據hashCode的結果進行不同的分支跳轉。字符串abc的

  在#5和#8字節處,首先是調用了hashCode()方法,然后它作為參數調用了switch(int)。在lookupswitch的指令里,根據hashCode的結果進行不同的分支跳轉。字符串“abc"的hashCode是96354,它會跳轉到#36處。字符串”123“的hashCode是48690,它會跳轉到#50處。生成的字節碼的長度比Java源碼長多了。首先,你可以看到字節碼里用lookupswitch指令來實現switch()語句。不過,這里使用了兩個lookupswitch指令,而不是一個。如果反編譯的是針對Int的switch()語句的話,字節碼里只會使用一個lookupswitch指令。也就是說,針對string的switch語句被分成用兩個語句來實現。留心標號為#5,#39和#53的指令,來看看switch()語句是如何處理字符串的。

  在第#36,#37,#39,以及#42字節的地方,你可以看見str參數被equals()方法來和字符串“abc”進行比較。如果比較的結果是相等的話,‘0’會被放入到局部變量數組的索引為#3的位置,然后跳抓轉到第#61字節。

  在第#50,#51,#53,以及#56字節的地方,你可以看見str參數被equals()方法來和字符串“123”進行比較。如果比較的結果是相等的話,10’會被放入到局部變量數組的索引為#3的位置,然后跳轉到第#61字節。

  在第#61和#62字節的地方,局部變量數組里索引為#3的值,這里是'0',‘1’或者其他的值,被lookupswitch用來進行搜索并進行相應的分支跳轉。

  換句話來說,在Java代碼里的用來作為switch()的參數的字符串str變量是通過hashCode()和equals()方法來進行比較,然后根據比較的結果,來執行swtich()語句。

  在這個結果里,編譯后的字節碼和之前版本的JVM規范沒有不兼容的地方。Java SE 7的這個用字符串作為switch參數的特性是通過Java編譯器來處理的,而不是通過JVM來支持的。通過這種方式還可以把其他的Java SE 7的新特性也通過Java編譯器來實現。

  總結

  我不認為為了使用好Java必須去了解Java底層的實現。許多沒有深入理解JVM的開發者也開發出了很多非常好的應用和類庫。不過,如果你更加理解JVM的話,你就會更加理解Java,這樣你會有助于你處理類似于我們前面的案例中的問題。

  除了這篇文章里提到的,JVM還是用了其他的很多特性和技術。JVM規范提供了是一種擴展性很強的規范,這樣就使得JVM的提供者可以選擇更多的技術來提高性能。值得特別說明的一點是,垃圾回收技術被大多數使用虛擬機的語言所使用。不過,由于這個已經在很多地方有更加專業的研究,我這篇文章就沒有對它進行深入講解了。

  對于熟悉韓語的朋友,如果你想要深入理解JVM的內部結構的話,我推薦你參考《Java Performance Fundamental》(Hando Kim,Seoul,EXEM,2009)。這本書是用韓文寫的,更適合你去閱讀。我在寫這本書的時候,參考了JVM規范,同時也參考了這本書。對于熟悉英語的朋友,你可以找到大量的關于Java性能的書籍。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97