好奇,哪个更有效?
此:
String a = someString + "." + anotherString;
或者这个:
String a = someString + '.' + anotherString;
答案 0 :(得分:13)
答案 1 :(得分:12)
查看StringBuilder.append
和AbstractStringBuilder.append
的代码,我会期待'。'形式更快。</ p>
基本上没什么可做的:
与其他人一样,我不认为这种差异在实际应用程序代码中会很重要。
我不知道Java编译器是否有效地认识到附加的是长度为1的常量字符串,而是将其转换为字符文字 - 或者即使它是否会打扰它是有效的。
答案 2 :(得分:6)
它们非常相似。 '.'
略快,但差异可以忽略不计(1000万次循环中大约20 ms)。
这是我的测试:
$cat UsingC.java UsingS.java
public class UsingC {
public static void main( String [] args ) {
String someString = "";
String anotherString = "";
int i = 0;
while( i++ < 10000000 ) {
String a = someString + '.' + anotherString;
}
}
}
public class UsingS{
public static void main( String [] args ) {
String someString = "";
String anotherString = "";
int i = 0;
while( i++ < 10000000 ) {
String a = someString + "." + anotherString;
}
}
}
$for i in 1 2 3 4 5 ; do time java UsingC; done
real 0m1.643s
user 0m1.424s
sys 0m0.108s
real 0m1.670s
user 0m1.468s
sys 0m0.056s
real 0m2.023s
user 0m1.448s
sys 0m0.080s
real 0m1.669s
user 0m1.432s
sys 0m0.088s
real 0m1.674s
user 0m1.416s
sys 0m0.104s
$for i in 1 2 3 4 5 ; do time java UsingS; done
real 0m2.344s
user 0m1.584s
sys 0m0.136s
real 0m2.057s
user 0m1.640s
sys 0m0.084s
real 0m2.112s
user 0m1.732s
sys 0m0.072s
real 0m2.482s
user 0m1.704s
sys 0m0.108s
real 0m2.134s
user 0m1.788s
sys 0m0.072s
您可以进行平均和/或创建更复杂的测试。
无论如何,它们都在内部使用StringBuilder。
答案 3 :(得分:1)
Java编译器会将任何字符串连接表达式转换为StringBuilder操作的等效序列。可以安全地假设序列接近最佳。实际上,在这个特定的例子中,我希望在两种情况下都能生成相同的(最佳)序列。但即使情况并非如此,差异也可能很小。
如果探查器告诉您特定语句是代码中的瓶颈,那么这种事情是值得打扰的。过早优化是毫无意义的(充其量),甚至可能是有害的。
Sun人员的建议是手动优化Java代码实际上可能是较慢的代码,因为生成的字节码序列变得太复杂,JIT编译器无法正确优化。最好的建议就是简单地编写代码并相信Javac和JIT编译器做得很好。