Java 当每个条件导致返回时,If vs If else vs切换

Java 当每个条件导致返回时,If vs If else vs切换,java,language-agnostic,Java,Language Agnostic,有人能解释一下,在一个类似于以下内容的大代码块中使用if、if else或开关之间的权衡(即使可以忽略不计)是什么吗?如果比较字符串或其他对象而不是int,情况会有所不同吗?这些例子是用Java编写的,但这只是一个一般性问题 编辑 正如几个答案所述,开关速度会更快,如果有超过几个情况,可能应该使用开关。然而,在像这样的长链中,没有人对ifvsif else发表过评论。引发这个问题的原因是,我经常创建这些无法使用开关的块,因为大多数情况下需要多个表达式。我想排除else感觉很草率,但这并不是真的必

有人能解释一下,在一个类似于以下内容的大代码块中使用
if
if else
开关之间的权衡(即使可以忽略不计)是什么吗?如果比较字符串或其他对象而不是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

VS


大多数编译器都会优化问题中的示例,使其接近甚至完全相同。因此,问题在于可读性

如果您有一两个案例,那么
If
语句通常是有意义的。如果有很多,尤其是每种情况下的代码都很小,那么
switch
语句在所需代码方面更经济,也更易于阅读


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

大多数编译器会优化您问题中的示例,使其接近甚至完全相同。因此,问题在于可读性

如果您有一两个案例,那么
If
语句通常是有意义的。如果有很多,尤其是每种情况下的代码都很小,那么
switch
语句在所需代码方面更经济,也更易于阅读


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

如果你有很多案例,那么
切换方法是首选方法。原因是前两个基本上需要对所有if语句进行线性搜索。因此,您的病例数是
O(N)

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


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

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

如果您有很多案例,那么
切换方法是首选方法。原因是前两个基本上需要对所有if语句进行线性搜索。因此,您的病例数是
O(N)

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


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

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

开关在可以使用时比if/else阻塞更快。当有5个以上的条目时,它被实现为查找。这提供了一些有关性能的信息:


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

开关在可以使用时比if/else块更快。当有5个以上的条目时,它被实现为查找。这提供了一些有关性能的信息:


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

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


。看看。

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


。看一看。

如果您有大量类似于所提供示例中的情况,那么我建议您使用地图

Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"one");
map.put(2,"two");
map.put(3,"three");
map.put(4,"four");
Map Map=newhashmap();
地图放置(1,“一”);
图.put(2,“2”);
地图放置(3,“三”);
地图放置(4,“四”);

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

如果您有大量类似于所提供示例中的条件,那么我建议使用映射

Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"one");
map.put(2,"two");
map.put(3,"three");
map.put(4,"four");
Map Map=newhashmap();
地图放置(1,“一”);
图.put(2,“2”);
地图放置(3,“三”);
地图放置(4,“四”);
我不确定如何权衡。我可以想象它的行为类似于switch语句。它将降低代码的圈复杂度,这将使代码更加复杂
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"one");
map.put(2,"two");
map.put(3,"three");
map.put(4,"four");