我应该使用if-then语句还是switch语句



我是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操作员具有:

  1. 需要编写更多的Java代码;

  2. 编译后多了一点字节码。即:

    11: lookupswitch  { // 1
    1: 28
    default: 39
    }
    

最新更新