作者qrtt1 (null)
站內java
標題Re: [J2SE] Java String觀念請教?
時間Thu May 1 15:38:33 2008
唔, 弟對考試的題目比較沒興趣: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