java 6或7编译器是否改进了str.startWith(“a”)并将其转换为str.charAt(0)=='a'如果它包含一个字符的字符串?

时间:2013-05-17 16:25:48

标签: java compiler-optimization pmd

Eclipse插件PMD建议我使用

str.charAt(0) == 'a'

而不是

str.startWith("a")

但是我不想让代码更复杂,我相信java编译器非常聪明,它们通过将str.start转换为str.charAt(0)=='a来提高str.startWith(“a”)的性能'(或类似的东西)。

我是对的吗?

2 个答案:

答案 0 :(得分:3)

快速微观基准测试表明,这两种方法的表现非常相似(每个方法在我的标准台式机上使用热点7的时间不到5纳秒)。

所以我会忽略该建议并使用对您来说更具可读性的任何版本的代码。

答案 1 :(得分:3)

这是使用Java 7编译类中的两种方法反编译的代码。没有对这两种方法进行优化,并且可以安全地假设Java 6编译器将执行任何此类优化:

之前:

String str = "abc";
if (str.charAt(0) == 'a') {
   System.out.println("Using CharAt");
}
if (str.startsWith("a")) {
   System.out.println("Using startsWith");
}

后:

String str = "abc";
if(str.charAt(0) == 'a')
    System.out.println("Using CharAt");
if(str.startsWith("a"))
    System.out.println("Using startsWith");