62,614
社区成员
发帖
与我相关
我的任务
分享
public class Test {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
String s = new String();
s = 11+"aa"+0001+true;
}
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
StringBuilder sb = new StringBuilder();
sb.append(11).append("aa").append(0001).append(true);
sb.toString();
}
System.out.println(System.currentTimeMillis());
}
}
反编译的字节码如下:
public static void main(java.lang.String[]);
Code:
0: getstatic #100; //Field java/lang/System.err:Ljava/io/PrintStream;
3: invokestatic #106; //Method java/lang/System.currentTimeMillis:()J
6: invokevirtual #110; //Method java/io/PrintStream.println:(J)V
9: iconst_0
10: istore_1
11: goto 28
14: new #115; //class java/lang/String
17: dup
18: invokespecial #117; //Method java/lang/String."<init>":()V
21: astore_2
22: ldc #118; //String 11aa1true
24: astore_2
25: iinc 1, 1
28: iload_1
29: sipush 10000
32: if_icmplt 14
35: getstatic #100; //Field java/lang/System.err:Ljava/io/PrintStream;
38: invokestatic #106; //Method java/lang/System.currentTimeMillis:()J
41: invokevirtual #110; //Method java/io/PrintStream.println:(J)V
44: iconst_0
45: istore_1
46: goto 85
49: new #60; //class java/lang/StringBuilder
52: dup
53: invokespecial #120; //Method java/lang/StringBuilder."<init>":()V
56: astore_2
57: aload_2
58: bipush 11
60: invokevirtual #121; //Method java/lang/StringBuilder.append:(I)Ljava/l
ang/StringBuilder;
63: ldc #124; //String aa
65: invokevirtual #71; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
68: iconst_1
69: invokevirtual #121; //Method java/lang/StringBuilder.append:(I)Ljava/l
ang/StringBuilder;
72: iconst_1
73: invokevirtual #126; //Method java/lang/StringBuilder.append:(Z)Ljava/l
ang/StringBuilder;
76: pop
77: aload_2
78: invokevirtual #75; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
81: pop
82: iinc 1, 1
85: iload_1
86: sipush 10000
89: if_icmplt 49
92: getstatic #100; //Field java/lang/System.err:Ljava/io/PrintStream;
95: invokestatic #106; //Method java/lang/System.currentTimeMillis:()J
98: invokevirtual #110; //Method java/io/PrintStream.println:(J)V
101: return
}
可以看到
ldc #118; //String 11aa1true
在编译期就生成了String 11aa1true。public class Test {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
String s = new String();
s = 11+"aa"+0001+true;
}
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
StringBuilder sb = new StringBuilder();
sb.append(11).append("aa").append(0001).append(true);
sb.toString();
}
System.out.println(System.currentTimeMillis());
}
}
这样的运算时间明显不一样,而且第一个快[/quote]
public class Test {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
String s = new String();
s = 11+"aa"+0001+true;
}
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
StringBuilder sb = new StringBuilder();
sb.append(11).append("aa").append(0001).append(true);
sb.toString();
}
System.out.println(System.currentTimeMillis());
}
}
这样的运算时间明显不一样,而且第一个快[/quote]
确实我的理解有误,忘记了 11+"aa"+0001+true; 都是常量,在编译时就优化成了s = "11aa0001true“;,如果改成
s +=11+"aa"+0001+true; 两个运行时间就应该一致了。
public class Test {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
String s = new String();
s = 11+"aa"+0001+true;
}
System.out.println(System.currentTimeMillis());
for(int i=0;i<10000;i++){
StringBuilder sb = new StringBuilder();
sb.append(11).append("aa").append(0001).append(true);
sb.toString();
}
System.out.println(System.currentTimeMillis());
}
}
这样的运算时间明显不一样,而且第一个快
public static void main(String[] args) {
long t = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
String s0 = String.valueOf(11);
}
System.out.println("耗时" + (System.currentTimeMillis() - t));
t = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
String s = "" + 11;
}
System.out.println("耗时" + (System.currentTimeMillis() - t));
String str = "";
t = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
String s = str + 11;
}
System.out.println("耗时" + (System.currentTimeMillis() - t));
}