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

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

我是java开发新手,已经做了大约一年的python。我理解在将一个变量与多个不同的值进行比较时如何使用switch语句,但我的问题是,如果只有两个不同的值(即x==1或x==0),使用switch语句还是if-else语句更为理想?我理解这两种方法是如何工作的,但我只是不知道在这种情况下是否会有区别,以及是否会有区别。

如果我没有错,切换速度比其他方法慢/if,因此这取决于您的使用情况。

这取决于具体情况。如果您只有一个选项,如
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
     }