我在java程序中有一个for循环,它循环遍历一组映射。
在循环中,我有大约10个不同的if语句,用于检查每个映射中每个键的名称。
示例:
for (<String, Object> map : object.entrySet()) {
if (map.getKey().equals.("something") {
do_something;
continue;
}
if (map.getKey().equals.("something_else") {
do_something_else;
continue;
}
if ...
}
添加像这样的continue语句时,我是否获得了任何性能?
当我在IDE中单步执行代码而没有这些continue语句时,即使第一个if语句匹配,也会对每个if语句进行测试。
如果我有这样的和第一个if匹配,for循环将跳过接下来的9个if语句并继续下一个对象。 也许编译后的代码会以不同的方式处理它,添加的continue语句实际上会使循环更慢?
答案 0 :(得分:7)
不是一直使用continue
,而只需执行一次getKey()
并使用else if
:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
if (key.equals("something")) {
// ...
} else if (key.equals("something else")) {
// ...
}
}
或使用switch
声明:
for (Map.Entry<String, Object> entry : map.entrySet()) {
switch (entry.getKey()) {
case "something":
// ...
break;
case "something else":
// ...
break;
}
答案 1 :(得分:4)
如果希望在第一个条件求值为true后结束当前迭代,则应使用if-else-if-...-else
。在我看来,这比使用continue
更清楚,因为这就是这种语法的存在。
for (<String, Object> map : object.entrySet()) {
if (map.getKey().equals.("something") {
do_something;
}
else if (map.getKey().equals.("something_else") {
do_something_else;
}
else if (...) {
...
}
... else {
...
}
}
答案 2 :(得分:0)
对于您当前的实现,是的,您通过使用continue
关键字跳过剩余的if语句来获得性能提升,尽管只有10个“if”语句的常量,但它并没有那么糟糕(10n = O (n)时间)。话虽如此,正如Eran所说,更实际的方法是使用else if
语句,这将达到您目前使用的相同结果。
答案 3 :(得分:-1)
因为您只有几个值,IMO,如果您将字符串映射到整数,那么您将在此处获得真正的性能改进,因为int比较远比字符串比较更快。
检查出来
public class Lab1 {
public static void main(String[] args) {
usingStrings();
usingInts();
}
private static void usingInts() {
int[] samples = new int[100000000];
int[] values = {1,2,3,4};
for(int i=0;i<samples.length-1;i++) {
samples[i] = values[(int)(Math.random()*values.length)];
}
int total = 0;
long ini = System.currentTimeMillis();
for(int i=0;i<samples.length-1;i++) {
if (1 == (samples[i])) {
total+=doSomeJob();
}else if (2 == (samples[i])) {
total+=doSomeJob();
}else if (3 == (samples[i])) {
total+=doSomeJob();
}else {
total+=doSomeJob();
}
}
long end = System.currentTimeMillis();
System.out.println("Ints="+(end-ini));
}
private static void usingStrings() {
String[] samples = new String[100000000];
String[] values = {"one mule","two mules","three mules","four mules"};
for(int i=0;i<samples.length-1;i++) {
samples[i] = values[(int)(Math.random()*values.length)];
}
int total = 0;
long ini = System.currentTimeMillis();
for(int i=0;i<samples.length-1;i++) {
if ("one mule".equals(samples[i])) {
total+=doSomeJob();
}else if ("two mules".equals(samples[i])) {
total+=doSomeJob();
}else if ("three mules".equals(samples[i])) {
total+=doSomeJob();
}else {
total+=doSomeJob();
}
}
long end = System.currentTimeMillis();
System.out.println("Strings="+(end-ini));
}
/**
*
*/
private static int doSomeJob() {
int c = 0;
for(int i=0;i<1000;i++) {
c++;
}
return c;
}
}
输出
Strings=962
Ints=6
实际上是DBMS索引在幕后工作的方式