Java 哪个代码段执行得更快?
我可以通过两种类型的代码片段做同样的事情 第一种方式:Java 哪个代码段执行得更快?,java,android,Java,Android,我可以通过两种类型的代码片段做同样的事情 第一种方式: String makeDate = Integer.toString(now.year) + Integer.toString(now.month) + Integer.toString(now.monthDay); 或者第二种方式: String makeDate = now.year + "" + now.month + "" + now.monthDay; 我的问题是: 哪种方法更可取[第一种方法还是第二种方法] 哪个代码段执行得
String makeDate = Integer.toString(now.year) + Integer.toString(now.month) + Integer.toString(now.monthDay);
或者第二种方式:
String makeDate = now.year + "" + now.month + "" + now.monthDay;
我的问题是:
你展示的两个鼻涕虫几乎一模一样 Java中的
字符串是不可变的;这是无法改变的。当使用串联运算符(+
)时,编译器实际上使用StringBuilder
例如,您的第二个snippit变为:
String makeDate = new StringBuilder()
.append(now.year)
.append("")
.append(now.month)
.append("")
.append(now.monthDay)
.toString();
您可以查看生成的字节码来了解这一点。Java附带了一个程序javap
,允许您查看编译的.class
我创建了一个简单的main()
,以提供最少的字节码:
public static void main(String[] args)
{
String makeDate = Integer.toString(1) + Integer.toString(1) + Integer.toString(1);
System.out.println(makeDate);
}
产生:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: iconst_1
8: invokestatic #4 // Method java/lang/Integer.toString:(I)Ljava/lang/String;
11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: iconst_1
15: invokestatic #4 // Method java/lang/Integer.toString:(I)Ljava/lang/String;
18: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: iconst_1
22: invokestatic #4 // Method java/lang/Integer.toString:(I)Ljava/lang/String;
25: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: astore_1
32: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
35: aload_1
36: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
39: return
产生:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: iconst_1
1: istore_1
2: new #2 // class java/lang/StringBuilder
5: dup
6: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
9: iload_1
10: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
13: ldc #5 // String
15: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
18: iload_1
19: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
22: ldc #5 // String
24: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: iload_1
28: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
31: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
34: astore_2
35: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
38: aload_2
39: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
42: return
publicstaticvoidmain(java.lang.String[]);
标志:ACC_公共,ACC_静态
代码:
堆栈=2,局部变量=3,参数大小=1
0:iconst_1
1:istore_1
2:new#2//类java/lang/StringBuilder
5:dup
6:invokespecial#3//方法java/lang/StringBuilder。”“:()V
9:iload_1
10:invokevirtual#4//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
13:ldc#5//String
15:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
18:iload_1
19:invokevirtual#4//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
22:ldc#5//String
24:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27:iload_1
28:invokevirtual#4//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
31:invokevirtual#7//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
34:astore_2
35:getstatic#8//fieldjava/lang/System.out:Ljava/io/PrintStream;
38:aload_2
39:invokevirtual#9//方法java/io/PrintStream.println:(Ljava/lang/String;)V
42:返回
从技术上讲,后者可能在一些几乎无法测量(<1ns)的规模上更快,但对于所有实际目的来说,这并不重要;用你喜欢的任何东西。用你觉得最可读的东西。您需要执行数十亿次才能注意到差异。它们都将在固定时间内执行,因此执行时间肯定不会成为问题。。。。。在我看来,第二种方式更优雅,没有必要包装任何东西。
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: iconst_1
1: istore_1
2: new #2 // class java/lang/StringBuilder
5: dup
6: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
9: iload_1
10: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
13: ldc #5 // String
15: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
18: iload_1
19: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
22: ldc #5 // String
24: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: iload_1
28: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
31: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
34: astore_2
35: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
38: aload_2
39: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
42: return