如果vs if-else vs switch,则每个条件都会返回

Jac*_*ips 1 java language-agnostic

谁能解释的折衷(即使它是可以忽略不计),会是怎样使用之间if,if else或者switch在类似如下的代码相当大的块?如果比较String或另一个Object而不是int,情况会有所不同吗?这些例子都是Java,但它是一个普遍的问题.

编辑

正如几个答案所述,一个开关会更快,如果有多个案例,应该可以使用.然而,在这样的长链中,没有人评论ifvs.if else引发这个问题的是我经常创建这些块,因为大多数情况需要多个表达式才能使用开关.我想排除else感觉草率,但这不是真的有必要,为什么要包括它?

public String getValueString(int x) {
    if (x == 1) return "one";
    if (x == 2) return "two";
    if (x == 3) return "three";
    if (x == 4) return "four";
    ...
    return null;
}
Run Code Online (Sandbox Code Playgroud)

VS

public String getValueString(int x) {
    if (x == 1) return "one";
    else if (x == 2) return "two";
    else if (x == 3) return "three";
    else if (x == 4) return "four";
    ...
    return null;
}
Run Code Online (Sandbox Code Playgroud)

VS

public String getValueString(int x) {
    switch(x) {
        case 1: return "one";
        case 2: return "two";
        case 3: return "three";
        case 4: return "four";
        ...
    }
    return null;        
}
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 7

如果您有很多案例,那么该switch方法是首选方法.原因是因为前两个基本上需要对所有if语句进行线性搜索.所以这是O(N)你拥有的案件数量.

另一方面,switch语句的优化方式不同,可以是O(log(N))或者甚至O(1)是找到正确的情况.


编译器如何实现O(log(N))甚至O(1)

  • 二进制搜索案例值将允许它完成O(log(N)).
  • 如果案例值足够密集,编译器甚至可以使用由case变量索引的跳转表.在那种情况下O(1).