六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

使用javap深入查看類文件

[摘要]Java 開發人員熟悉在一個循環中使用StringBuffer 來代替串聯 String 對象能獲得最佳性能。然而,多數開發人員從來沒有比較兩種方法產生的字節代碼的區別。在 Java 開發工具包(JDK)中有一個叫做 javap 的工具可以告訴你為什么這樣做可以獲得最佳性能。   Javap 將一...
Java 開發人員熟悉在一個循環中使用StringBuffer 來代替串聯 String 對象能獲得最佳性能。然而,多數開發人員從來沒有比較兩種方法產生的字節代碼的區別。在 Java 開發工具包(JDK)中有一個叫做 javap 的工具可以告訴你為什么這樣做可以獲得最佳性能。

  Javap 將一個類和它的方法的一些轉儲信息輸出到標準輸出。該工具不把代碼反編譯為 java 源代碼,但是它會把字節代碼反匯編成為由 Java 虛擬機規范定義的字節代碼指令。

  在你需要查看編譯器為你或者給你做了什么的時候,或者你想要看一處代碼的改動對編譯后的類文件有什么影響的時候,javap 相當有用。

  現在以我們前面提到的 StringBuffer 和 String 作為一個例子。下面是一個專門為例子設計的類,它有兩個方法,都返回一個由0到 n 的數字組成的 String,其中 n 由調用者提供。兩個方法唯一的區別在于一個使用 String 構建結果,另外一個使用 StringBuffer 構建結果。

  public class JavapTip {
   public static void main(String []args) {
   }

   private static String withStrings(int count) {
   String s = "";
   for (int i = 0; i < count; i++) {
   s += i;
   }

   return s;
   }

   private static String withStringBuffer(int count) {
   StringBuffer sb = new StringBuffer();
   for (int i = 0; i < count; i++) {
   sb.append(i);
   }

   return sb.toString();
   }
  }

  現在讓我們看看對這個類使用–c 選項運行 javap 的輸出。-c 選項告訴 javap 反匯編在類中遇到的字節代碼。

  運行方式如下:

  >javap -c JavapTip

  此命令的輸出為:

  Method java.lang.String withStrings(int)
   0 ldc #2
   2 astore_1
   3 iconst_0
   4 istore_2
   5 goto 30
   8 new #3
   11 dup
   12 invokespecial #4
   15 aload_1
   16 invokevirtual #5
   19 iload_2
   20 invokevirtual #6
   23 invokevirtual #7
   26 astore_1
   27 iinc 2 1
   30 iload_2
   31 iload_0
   32 if_icmplt 8
   35 aload_1
   36 areturn

  Method java.lang.String withStringBuffer(int)
   0 new #3
   3 dup
   4 invokespecial #4
   7 astore_1
   8 iconst_0
   9 istore_2
   10 goto 22
   13 aload_1
   14 iload_2
   15 invokevirtual #6
   18 pop
   19 iinc 2 1
   22 iload_2
   23 iload_0
   24 if_icmplt 13
   27 aload_1
   28 invokevirtual #7
   31 areturn

  如果你以前沒有看過 Java 匯編器,那么這個輸出對你來說就會比較難懂,但是你應該可以看到 withString 方法在每次循環的時候都新創建了一個 StringBuffer 實例。然后它將已有的 String 的當前值追加到 StringBuffer 上,然后追加循環的當前值。最后,它對 buffer 調用 toString 并將結果賦給現有的 String 引用。

  withStringBuffer 方法與這個方法正好相反,在每次循環的時候 withStringBuffer 只調用現有 StringBuffer 的 append 方法,沒有創建新的對象,也沒有新的 String 引用。

  在這種情況下,我們已經知道了使用 StringBuffer 代替 String 是一種好的做法,但是如果我們不知道呢?那么 javap 可以幫助我們找到答案。在這里你可以看到更詳細的關于String,StringBuffer 的解釋

  你并不會經常需要一個 Java 反匯編器,但是當你需要的時候,知道你自己的機器已經有一個并且用法相當簡單的反匯編器當然是一件好事。如果你感興趣,看書看看 javap 的其它選項——或許你會發現在你的環境中需要的特性。


  --------------------------------------------------------------------------------
  本文作者:David Petersheim是Genscape公司的一位應用開發主任。他設計和開發服務器端應用程序來獲取和處理實時能源數據。



主站蜘蛛池模板: 日本韩国三级在线 | 欧美一级视 | 性久久久久久久久久 | 午夜私人影院粉色视频我要 | 香港全黄一级毛片在线播放 | 青草 | 青草视频免费在线观看 | 在线播放国产一区二区三区 | 亚洲一区免费在线观看 | 天天亚洲 | 综合丁香 | 亚洲欧洲在线观看 | 亚洲综合自拍 | 日本一区二区三区免费观看 | 视频在线二区 | 污污免费视频 | 婷婷六月激情 | 日本五级床片全部免费午夜 | 日本不卡一区二区三区在线观看 | 小说区 亚洲 自拍 另类 | 色无极在线 | 五月天婷婷在线视频 | 四虎国产精品免费久久影院 | 色欧美片视频在线观看 | 亚洲欧洲国产精品你懂的 | 亚洲免费在线视频 | 婷婷综合七月激情啪啪 | 中文不卡视频 | 色综合手机在线 | 日本一本在线观看 | 性荡视频播放器在线视频播放 | 亚洲在成人网在线看 | 中文字幕日本一区波多野不卡 | 天美视频在线观看 | 午夜久久网 | 三级黄色片在线播放 | 色yeye在线观视频 | 日韩国产有码在线观看视频 | 伊人网在线免费视频 | 午夜综合| 五月婷婷激情四射 |