for循环中的if语句是否比Java中的if语句快一一?

时间:2019-05-30 16:18:21

标签: java performance for-loop if-statement hashmap

我想知道,如果我使用HashMap收集条件并在if语句中循环一个接一个地循环,我能否达到更高的性能,而不是一个一个if-else if语句一个接一个地编写?

我认为,一对一的if-else,if语句可能会更快,因为在for循环中每个循环都运行另外一个条件,例如计数器是否达到目标数?因此实际上每个if语句都运行2条if语句。当然,在语句内部有所不同,但是如果仅讨论语句性能,我认为一对一类型会更好?

编辑:这只是一个示例代码,我的问题是关于这些语句的使用之间的性能差异。

Map<String, Integer> words = new HashMap<String, Integer>
String letter ="d";
int n = 4;
words.put("a",1);
words.put("b",2);
words.put("c",3);
words.put("d",4);
words.put("e",5);

words.forEach((word,number)->{
if(letter.equals(word){
System.out.println(number*n);
});

String letter ="d";
int n = 4;
if(letter.equals("a"){
System.out.println(number*1);
}else if(letter.equals("b"){
System.out.println(number*2);
}else if(letter.equals("c"){
System.out.println(number*3);
}else if(letter.equals("d"){
System.out.println(number*4);
}else if(letter.equals("e"){
System.out.println(number*5);
}

2 个答案:

答案 0 :(得分:2)

对于您的示例,拥有HashMap但随后进行迭代查找似乎是一个坏主意。使用HashMap的目的是能够进行基于哈希的查找。这比进行迭代查找要快得多。

此外,在您的示例中,级联if-then测试肯定会更快,因为它们将避免映射迭代器和额外的函数调用的开销。同样,它们将避免映射迭代器跳过哈希映射后备数组中的空存储位置的开销。一个更好的问题是级联if-thens是否比遍历简单列表更快。这很难回答。级联if-thens似乎更快,除非如果if-thens太多,则应该增加加载代码的成本。

对于字符串查找,列表数据结构提供了足够的行为,直至达到极限值,在此之上必须使用更复杂的数据结构。极限值是多少取决于环境。对于字符串比较,我发现了20到100个元素之间的过渡。

对于特定查找以及是否可以使用低级优化,过渡值可能会大得多。例如,使用“ C”进行整数查询将可以直接进行内存查询,过渡值要高得多。

典型的数据结构是HashMap,Tries和排序数组。每个都适合特定的访问模式。例如,排序的数组最快,最紧凑,但是更新成本很高。 HashMaps支持动态更新,并且对于良好的哈希函数,提供恒定的时间查找。但是,由于HashMap依赖于散列值之间具有空单元格,因此空间效率低下。

对于不涉及“非常大”数据集且不在关键“热门”代码路径中的情况,HashMap是常用的结构。

答案 1 :(得分:1)

如果您有地图并且想检索一个字母,我不确定为什么会循环吗?

Map<String, Integer> words = new HashMap<String, Integer>
String letter ="d";
int n = 4;
words.put("a",1);
words.put("b",2);
words.put("c",3);
words.put("d",4);
words.put("e",5);

if (words.containsKey(letter) {
  System.out.println(words.get(letter)*n);
}
else
{
  System.out.println(letter + " doesn't exist in Map");
}

如果您没有使用地图的优势,那为什么还要使用地图呢?

forEach实际上将触摸列表中的每个键。 if / else上的检查次数取决于它在列表中的位置以及可用字母列表的长度。如果您选择的字母是列表中的最后一个字母,则它将在打印之前完成所有检查。如果是第一个,那么它只会做一个比必须检查全部要快得多的操作。

您很容易编写两个示例并运行计时器来确定哪个实际上更快。 https://www.baeldung.com/java-measure-elapsed-time

如果必须运行一百万条if / else语句,而只选择一个可能位于列表中任何位置的语句,则会有很多浪费的计算。这不包括错别字和代码维护的恐怖。使用带有索引的地图会更快。如果您仅谈论100条if / else语句(我认为仍然太多),那么您也许可以在速度上实现收支平衡。