Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
for循环中的if语句比Java中的逐个if语句快吗?_Java_Performance_For Loop_If Statement_Hashmap - Fatal编程技术网

for循环中的if语句比Java中的逐个if语句快吗?

for循环中的if语句比Java中的逐个if语句快吗?,java,performance,for-loop,if-statement,hashmap,Java,Performance,For Loop,If Statement,Hashmap,我想知道,如果我使用HashMap来收集条件并在一个if语句中循环每个条件,我是否可以达到更高的性能,而不是逐个编写if-else if语句 在我看来,一个接一个if-else,if语句可能更快,因为In-for循环在每个循环中运行一个以上的条件,比如,计数器是否达到目标数?实际上,每个if语句都运行两个if语句。当然,语句内部不同,但如果我们只讨论语句性能,我认为逐个类型会更好 编辑:这只是一个示例代码,我的问题是关于这些语句使用之间的性能差异 Map words=新HashMap 字符串字母

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

在我看来,一个接一个if-else,if语句可能更快,因为In-for循环在每个循环中运行一个以上的条件,比如,计数器是否达到目标数?实际上,每个if语句都运行两个if语句。当然,语句内部不同,但如果我们只讨论语句性能,我认为逐个类型会更好

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

Map words=新HashMap
字符串字母=“d”;
int n=4;
字。放(a),1;
字。付诸表决(“b”,2);
字.put(“c”,3);
字。付诸表决(“d”,4);
字。付诸表决(“e”,5);
单词。forEach((单词,数字)->{
如果(字母)等于(单词){
系统输出打印项次(编号*n);
});
String letter=“d”;
int n=4;
if(字母等于(“a”){
系统输出打印项次(编号*1);
}else if(字母等于(“b”){
系统输出打印项次(编号*2);
}else if(字母等于(“c”){
系统输出打印项次(编号*3);
}else if(字母等于(“d”){
系统输出打印项次(编号*4);
}else if(字母等于(“e”){
系统输出打印项次(编号*5);
}

如果你有一张地图,你想检索一封信,我不知道你为什么要循环

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");
}
Map words=新HashMap
字符串字母=“d”;
int n=4;
字。放(a),1;
字。付诸表决(“b”,2);
字.put(“c”,3);
字。付诸表决(“d”,4);
字。付诸表决(“e”,5);
如果(文字)包含(字母){
System.out.println(words.get(字母)*n);
}
其他的
{
System.out.println(地图中不存在字母+);
}
如果你没有使用地图的好处,那么为什么要使用地图呢

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

编写这两个示例并运行计时器来确定哪一个速度更快,对您来说是很容易的。


如果你必须运行100万条if/else语句,并且只选择一条可能在列表中任何位置的语句,那么会有很多计算被浪费。这不包括拼写错误和代码维护的恐惧。使用带有索引的映射会快得多。如果你只说100条if/else语句(在我看来还是太多了)然后,您可能能够在速度上实现收支平衡。

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

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

对于字符串查找,列表数据结构提供了足够的行为,最高可达一个极限值,超过这个极限值必须使用更复杂的数据结构。极限值是多少取决于环境。对于字符串比较,我发现了20到100个元素之间的转换

对于特定的查找,以及是否存在低级别优化,转换值可能会大得多。例如,使用“C”进行整数查找(可以进行直接内存查找),转换值会大得多

典型的数据结构是哈希映射、尝试和排序数组。每种结构都适合特定的访问模式。例如,排序数组速度最快、结构最紧凑,但更新成本较高。哈希映射支持动态更新,对于好的哈希函数,提供恒定的时间查找。但是,哈希映射空间效率低下,因为它们依赖于散列值之间有空单元格的


对于不涉及“非常大”数据集且不处于关键“热”状态的情况代码路径、哈希映射是常用的结构。

您需要展示您的代码以更好地解释您的意思。您是否在任何情况下使用短路或在满足条件时中断?您很可能在毫无意义的微优化上浪费时间。Java速度来自将字节码转换为mac的jithine代码。您在Java源代码中所做的这一级别的工作几乎没有影响。编写简单易懂的代码。提示:jit非常擅长将简单代码转换为快速的机器指令。@GhostCat微优化通常是毫无意义的,但并不总是如此。它不应该被任何人视为信条不允许进行微优化。虽然编译器确实可以进行难以置信的优化,但它肯定会根据您在许多情况下编写的代码进行不同的优化。因此,您编写的代码非常重要。OP“在我看来”您(和我)意见不值得写在纸上。衡量。@mypetlion因此我说“最有可能”。正如所料,OP显示了包含打印语句的代码。这告诉我们,他没有真正的性能问题,而是一个假想的问题。测量这里显示的代码甚至没有意义。不要访问映射两次:
Integer result=words.get(letter);if(result!=null){System.out.println(result*n);}…
@JorgeCampos Va