Java 我应该使用if-then语句还是switch语句?
我是java开发新手,已经做了大约一年的python。我理解在将一个变量与多个不同的值进行比较时如何使用switch语句,但我的问题是,如果只有两个不同的值(即x==1或x==0),使用switch语句还是if-else语句更为理想?我理解这两种方法是如何工作的,但我只是不知道在这种情况下是否会有区别,以及是否会有区别。如果我没有错,切换速度比其他方法慢/if,因此这取决于您的使用情况。这取决于具体情况。如果您只有一个选项,如Java 我应该使用if-then语句还是switch语句?,java,if-statement,variables,optimization,switch-statement,Java,If Statement,Variables,Optimization,Switch Statement,我是java开发新手,已经做了大约一年的python。我理解在将一个变量与多个不同的值进行比较时如何使用switch语句,但我的问题是,如果只有两个不同的值(即x==1或x==0),使用switch语句还是if-else语句更为理想?我理解这两种方法是如何工作的,但我只是不知道在这种情况下是否会有区别,以及是否会有区别。如果我没有错,切换速度比其他方法慢/if,因此这取决于您的使用情况。这取决于具体情况。如果您只有一个选项,如x==4,并且只有两个操作,我将使用If语句。 例如,如果你有If(x
x==4
,并且只有两个操作,我将使用If语句。
例如,如果你有If(x==2 | | x==27 | | x==31){}或者如果(x==4 | | x==29 | | x==33){}或者{}
我会使用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);
}
从性能角度来看,我会说,如果速度更快,如果只有一些情况(2-4),然后我会说一句switch语句:用你喜欢的
如果你对内部结构感兴趣,那么继续阅读。我们不必猜测你问题的答案。我已经编写了一个简单的示例程序,让我们在实际实现中看到它。首先我将检查if-else
,然后我将检查开关
否则
现在,在我们将其保存在简单文本编辑器中并使用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
}
同样,我们使用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
}
使用任何能让你的代码更清晰的东西。嗨,Jonah,我希望你喜欢Java——就个人而言,我不会担心优化——这只是风格的问题——什么感觉更可读?它可能取决于为每个值执行的代码。如果只有两个可能的值,那么还有另一个选项-可能是最简洁的-x==1?doOneThing():doOtherThing();这是个人喜好/意见的问题。如果只有两个选项,工程师通常使用If/else。如果有多个选项,并且比较字符串/整数/枚举,则可以执行或。
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");
}
}
}
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
}
11: lookupswitch { // 1
1: 28
default: 39
}