我想知道如果我使用 HashMap 来收集条件并在一个 if 语句中循环每个条件,我是否可以达到更高的性能,而不是一个接一个地编写 if - 否则 if 语句?
在我看来,一个接一个的if-else,如果语句可能更快,因为 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);
}
对于您的示例,拥有一个 HashMap 但随后进行迭代查找似乎是一个坏主意。 使用HashMap的目的是能够进行基于哈希的查找。 这比执行迭代查找要快得多。
此外,从您的示例中,级联 if-then 测试肯定会更快,因为它们将避免映射迭代器和额外函数调用的开销。 此外,它们将避免映射迭代器跳过哈希映射支持数组中的空存储位置的开销。 一个更好的问题是级联 if-thens 是否比遍历简单列表更快。 这很难回答。 级联 if-thens 似乎可能更快,除了如果有很多 if-then,那么应该增加加载代码的成本。
对于字符串查找,列表数据结构提供了足够的行为,直到限制值,超过该值必须使用更复杂的数据结构。 极限值是多少取决于环境。 对于字符串比较,我发现了 20 到 100 个元素之间的转换。
对于特定的查找,以及低级别优化是否可用,转换值可能会大得多。 例如,使用"C"进行整数查找,这将执行直接内存查找,转换值要高得多。
典型的数据结构是HashMaps,Tries和排序数组。 每个都适合特定的访问模式。 例如,排序数组速度最快、最紧凑,但更新成本很高。 HashMaps 支持动态更新,对于良好的哈希函数,提供恒定时间查找。 但是,HashMaps的空间效率低下,因为它们依赖于哈希值之间的空单元格。
对于不涉及"非常大"数据集且不在关键"热"代码路径中的情况,HashMaps 是常用的结构。
如果你有一个地图,你想检索一个字母,我不确定你为什么要循环?
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
如果您必须运行 100 万个 if/else 语句并且只选择一个可能在列表中任何位置的语句,那么就会有很多浪费的计算。这不包括拼写错误和代码维护的恐怖。使用带有索引的地图会快得多。如果您只谈论 100 个 if/else 语句(在我看来仍然太多),那么您也许可以在速度上实现收支平衡。