看板 java 關於我們 聯絡資訊
唔, 弟對考試的題目比較沒興趣:P Compiled from "XD.java" class XD extends java.lang.Object{ XD(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public java.lang.String foo(); Code: 0: ldc #2; //String Fred 2: astore_1 3: new #3; //class java/lang/StringBuilder 6: dup 7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 10: aload_1 11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 14: ldc #6; //String 47 16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 22: astore_1 23: aload_1 24: iconst_2 25: iconst_5 26: invokevirtual #8; //Method java/lang/String.substring:(II)Ljava/lang/String; 29: astore_1 30: aload_1 31: invokevirtual #9; //Method java/lang/String.toUpperCase:()Ljava/lang/String; 34: astore_1 35: aload_1 36: invokevirtual #10; //Method java/lang/String.toString:()Ljava/lang/String; 39: areturn public static void main(java.lang.String[]); Code: 0: return } 反組譯後,看起來 Fred 和 47 都變成常數,先以 StringBuilder 組裝起來 (如果是 5.0 以前就會用 StringBuffer) 而大家比較關心的是 String 是否真的被建立了 看起來應該是從 StringBuilder 被 toString 開始 他們恰好都被放在 1 號變數區運算 所以 count astore_1 有 4 個 如果把 return 也運進去, 那可以 + 1 如果至少可以確定 String.toString() 不會產生 astore_1 XD 考試上的觀念俺並不懂,如果錯了別找我要分 :P -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.80.216
AI3767:astore_1看來發生在s變數的assignment,method內也只有1個變 05/01 16:30
AI3767:數最大需求在做運算,所以才用到1個變數區 05/01 16:33
jtmh:其實要算 String 物件被建立次數的話應該要算 new 的個數。 05/02 00:01
Lordaeron:這些是哪個組譯器的assembly code? 05/02 16:53
qrtt1:sun的 05/02 18:11