我没有真正的运气,通过使用Google来获得这个比较的简明回答,而不是自己耗时的评估,我以为我会先问.
我相当肯定,使用枚举的switch语句的执行速度要比if-then-else语句快,不过它是否是一个显着的区别是另一个问题.
有人可以为我说明一下吗?
解决方法
是的,因为一般来说,switch语句的工作速度比if / else链的速度要快.
虽然生成的字节码并不总是确定性能比较的来源,但您可以检查它是否有更好的想法.
例如这个代码:
class A { enum N { ONE,TWO,THREE } void testSwitch( N e ) { switch( e ) { case ONE : x(); break; case TWO : x(); break; case THREE : x(); break; } } void testIf( Enum e ) { if( e == N.ONE ) { x(); } else if( e == N.TWO ) { x(); } else if( e == N.THREE ) { x(); } } void x(){} }
Compiled from "A.java" class A extends java.lang.Object{ A(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return void testSwitch(A$N); Code: 0: getstatic #2; //Field A$1.$SwitchMap$A$N:[I 3: aload_1 4: invokevirtual #3; //Method A$N.ordinal:()I 7: iaload 8: tableswitch{ //1 to 3 1: 36; 2: 43; 3: 50; default: 54 } 36: aload_0 37: invokevirtual #4; //Method x:()V 40: goto 54 43: aload_0 44: invokevirtual #4; //Method x:()V 47: goto 54 50: aload_0 51: invokevirtual #4; //Method x:()V 54: return void testIf(java.lang.Enum); Code: 0: aload_1 1: getstatic #5; //Field A$N.ONE:LA$N; 4: if_acmpne 14 7: aload_0 8: invokevirtual #4; //Method x:()V 11: goto 39 14: aload_1 15: getstatic #6; //Field A$N.TWO:LA$N; 18: if_acmpne 28 21: aload_0 22: invokevirtual #4; //Method x:()V 25: goto 39 28: aload_1 29: getstatic #7; //Field A$N.THREE:LA$N; 32: if_acmpne 39 35: aload_0 36: invokevirtual #4; //Method x:()V 39: return void x(); Code: 0: return }
这两种情况似乎都相当快.
所以,选择一个更容易维护的.