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
vsif 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");