1

if谁能解释使用,if elseswitch在类似于以下的相当大的代码块之间的权衡(即使它可以忽略不计) ?如果比较的是 String 或另一个 Object 而不是 int,情况会有所不同吗?这些示例是用 Java 编写的,但它是一个一般性问题。

编辑

正如几个答案所述,开关会更快,如果有多种情况,可能应该使用开关。但是,没有人评论过这样ifif 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;
}

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;
}

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;        
}
4

5 回答 5

7

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

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


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

  • 案例值的二进制搜索将允许它在O(log(N)).
  • 如果 case 值足够密集,编译器甚至可以使用由 case 变量索引的跳转表。在这种情况下,它是O(1)
于 2012-04-17T04:22:16.860 回答
2

大多数编译器会将您问题中的示例优化为几乎甚至完全相同。因此,问题在于可读性。

如果你有一个或两个案例,一个if陈述通常是有意义的。如果你有很多,特别是如果每​​种情况的代码都很小,那么switch就所需的代码而言,语句往往更经济,并且更容易阅读。

但是,至少在某种程度上,可读性是个人喜好的问题。

于 2012-04-17T04:22:06.247 回答
2

Switch 在可以使用时比 if/else 块快。当条目超过 5 个时,它被实现为查找。这提供了一些有关性能的信息:“else if”是否比“switch() case”快?

我相信在这些情况下它也更具可读性。

于 2012-04-17T04:23:17.453 回答
1

if对于较少的项目,语句和语句之间不会有显着的性能差异switch。在switch语句中,每个项目都是在同一时间直接访问的,因此最后一个项目将与第一个项目花费相同的时间。Inif语句访问最后一个项目将比第一个项目花费更长的时间,因为它必须遍历它之前的所有项目。无论如何,对于您的示例中较少的项目,延迟不会很明显。

这是关于这个主题的一个很好的讨论。看一看。

于 2012-04-17T04:39:36.967 回答
0

如果您有大量类似于提供的示例中的条件,那么我会推荐一个 Map。

Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"one");
map.put(2,"two");
map.put(3,"three");
map.put(4,"four");

我不确定权衡。我想它的行为类似于 switch 语句。它将降低代码的圈复杂度,使其更具可读性。

于 2012-04-17T05:16:25.747 回答