当检查相等性时,将字符串转换为整数还是将整数转换为字符串更有效?

8

以下是设置:

int a=3;
String b="3";

这两个变量代表语义上相等的ID。由于应用程序是为移动设备设计的,因此比较这些变量的效率非常重要。

使用以下代码片段比较这些变量是否有效:

boolean areEqual = Integer.parseInt(b) == a;

还是用这个?
boolean areEqual = String.valueOf(a).equals(b);

5
仅仅因为是移动设备,并不意味着你需要以最高效的方式完成所有任务。你是否进行了分析,以确定这真的是一个瓶颈?如果有,请尝试两种不同的方法并比较结果。文本值是否可能是整数的文本表示? - Jon Skeet
2
你很难找到两者之间有任何实质性的区别。 - Brian Roach
如果 b 不是整数会发生什么? - nachokk
可能是 https://dev59.com/THRB5IYBdhLWcg3wyqOo 的重复问题。 - Phil
1
https://dev59.com/AGQo5IYBdhLWcg3whPvI - Pavlos
6
过早优化。无论如何,除非这个操作被执行了数百万次,否则速度上的收益是微不足道的。 - m0skit0
3个回答

4

除非您进行这种比较数千次,否则可能不会有影响。话虽如此,如果您查看每个语句的执行过程:

boolean areEqual = Integer.parseInt(b) == a; 该语句一次解析String值,然后快速比较两个原始int值。

boolean areEqual = String.valueOf(a).equals(b); 该语句处理一个String,以创建aString值,然后进行String比较。步骤更多,内部逻辑更多,因此效率较低。


1
@Ruchira 写了一个测试,我对其进行了重写。这个测试支持你的陈述:http://ideone.com/wJmy3a - Martijn Courteaux
1
我并没有真正寻找确认测试……我只是认为每个操作所需的处理器周期越少,效率就越高。当然,有时候看起来应该更简单的东西实际上并不是这样,但在这种情况下,它似乎非常明显。 - StormeHawke
1
是的,这确实相当清晰。我只是试图改进他错误的测试(它给出了相反的结果)。这很令人高兴看到。 - Martijn Courteaux
我认为第二个确实会更慢,但主要是因为需要分配一个新的String对象(稍后将被垃圾回收)。第一个可能没有进行任何分配。 - Thomas
1
这也是问题的一部分。但即使是与现有字符串进行比较,字符串比较始终比整数比较慢,因为需要比较字符串中的每个单个字符。CPU可以在单个操作中完成整数比较。 - StormeHawke

1
如果您知道字符串包含数字,最有效的方法可能是;
boolean areEqual = (a == (b.charAt(0) - '0'));

1
你的代码最大的低效率可能在于每次比较时都要在int和String之间进行转换。 在第一次获取数据时就将String转换为int,这样还能确保任何错误消息立即传达给用户,例如当他/她输入错误时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接