任何人都能解释在类似以下的大量代码中使用if
,if else
或switch
之间的权衡(即使它可以忽略不计)吗?如果比较String或另一个Object而不是int,情况会有所不同吗?这些例子都是用Java编写的,但这是一个普遍的问题。
修改
正如几个答案所述,一个开关会更快,如果有多个案例,应该可以使用。但是,在这样的长链中,没有人对if
vs 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;
}
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;
}
答案 0 :(得分:7)
如果您有很多案例,那么switch
方法是首选方法。原因是因为前两个基本上需要对所有if语句进行线性搜索。所以你的案件数量是O(N)
。
另一方面,switch
语句的优化方式不同,可以O(log(N))
甚至O(1)
来查找正确的案例。
编译器如何实现O(log(N))
甚至O(1)
?
O(log(N))
。O(1)
。答案 1 :(得分:2)
大多数编译器会将您问题中的示例优化为几乎或甚至完全相同。因此,问题在于可读性。
如果您有一两个案例,if
语句通常是有意义的。如果您有很多,特别是如果每个案例的代码都很小,那么switch
语句在所需代码方面往往更经济,并且更容易阅读。
但是,至少在某一点上,可读性是个人偏好的问题。
答案 2 :(得分:2)
当可以使用时,切换比if / else阻塞更快。如果有超过5个条目,则将其实现为查找。这提供了一些有关性能的信息:Is "else if" faster than "switch() case"?
我相信在这些情况下它也更具可读性。
答案 3 :(得分:1)
对于较少的项目,if
语句和switch
语句之间不会有显着的性能差异。在switch
语句中,每个项目都是同时直接访问的,因此最后一个项目将与第一个项目同时进行。在if
语句中访问最后一项将花费比第一项更长的时间,因为它必须遍历它之前的所有项。无论如何,对于更少的项目,延迟将不会显着,如您的示例所示。
答案 4 :(得分:0)
如果您有大量类似于提供示例中的条件,那么我会推荐一张地图。
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语句类似。它会降低代码的圈复杂度,使其更具可读性。