我是java开发的新手,做python大约一年了。我理解在将一个变量与多个不同值进行比较时如何使用switch语句,但我的问题是,如果只有两个不同的值(即x==1或x==0(,使用switch声明还是if-else声明更合适?我理解两者的工作原理,但我不知道在这种情况下是否会有区别,以及是否会有什么区别。
如果我没有错的话,switchs比else/If慢,所以根据您的使用情况,这是需要了解的。
这取决于情况。如果你只有一个像x==4
这样的替代方案,只有两个操作,我会使用If语句。例如,如果您有if(x==2||x==27||x==31){}else if(x==4||x==29||x==33){}else{}
,我会使用switch语句。在这种情况下,switch语句更可读:
switch(x){
case 2:
case 27:
case 31:
foo();
break;
case 4:
case 29:
case 33:
bar();
break;
default:
throw new IllegalArgumentException("Invalid value for x: "+x);
}
从性能POV我会说,如果更快,如果只有一些情况(2-4(,之后我会切换语句
长话短说:使用任何您喜欢使用的;
如果你对内部感兴趣,那就继续读下去。我们不必猜测你问题的答案。我已经编写了一个简单的示例程序,让我们在实际实现中看到它。首先,我将检查if-else
,然后检查switch
。
如果其他
public class IfElse {
public static void main(String[] args) {
int x = Integer.valueOf(args[0]);
if (x==1) {
System.out.println("x is 1");
} else {
System.out.println("x is not 1");
}
}
}
现在,在我们将其保存在简单的文本编辑器中并使用javac IfElse.java
进行编译后,Java编译器将生成一个IfElse.class
文件,该文件具有以下字节码:
javap -c IfElse.class
Compiled from "IfElse.java"
public class IfElse {
public IfElse();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aload_0
1: iconst_0
2: aaload
3: invokestatic #2 // Method java/lang/Integer.valueOf:(Ljava/lang/String;)Ljava/lang/Integer;
6: invokevirtual #3 // Method java/lang/Integer.intValue:()I
9: istore_1
10: iload_1
11: iconst_1
12: if_icmpne 26
15: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
18: ldc #5 // String x is 1
20: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
23: goto 34
26: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
29: ldc #7 // String x is not 1
31: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
34: return
}
开关
public class Switch {
public static void main(String[] args) {
int x = Integer.valueOf(args[0]);
switch(x) {
case 1:
System.out.println("x is 1");
break;
default:
System.out.println("x is not 1");
}
}
}
以同样的方式,我们用javac Switch.java
编译它,然后看到字节码:
Compiled from "Switch.java"
public class Switch {
public Switch();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aload_0
1: iconst_0
2: aaload
3: invokestatic #2 // Method java/lang/Integer.valueOf:(Ljava/lang/String;)Ljava/lang/Integer;
6: invokevirtual #3 // Method java/lang/Integer.intValue:()I
9: istore_1
10: iload_1
11: lookupswitch { // 1
1: 28
default: 39
}
28: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
31: ldc #5 // String x is 1
33: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
36: goto 47
39: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
42: ldc #7 // String x is not 1
44: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
47: return
}
结论:
switch
操作员具有:
需要编写更多的Java代码;
编译后多了一点字节码。即:
11: lookupswitch { // 1 1: 28 default: 39 }