在您发布的两个片段中,我不想说。我同意 Will 的观点,几乎可以肯定它与代码的整体性能无关——如果不是,您可以进行更改并自己确定哪个对您的硬件上的 JVM 的数据最快。
也就是说,如果您先将 String 转换为 char 数组,然后在数组上执行迭代,则第二个片段可能会更好。这样做只会执行一次字符串开销(转换为数组),而不是每次调用。此外,您可以使用一些索引将数组直接传递给 String 构造函数,这比从数组中取出一个字符单独传递它(然后变成一个字符数组)更有效:
String s = "abcdefg";
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i++) {
newFunction(String.valueOf(chars, i, 1));
}
但是为了加强我的第一点,当您查看每次调用时实际上要避免的内容时String.charAt()
- 这是两个边界检查,一个(惰性)布尔 OR 和一个加法。这不会产生任何明显的差异。String 构造函数也没有区别。
从本质上讲,这两个习惯用法在性能方面都很好(两者都没有立即明显低效),因此您不应该再花时间处理它们,除非分析器显示这会占用大量应用程序的运行时间。即使这样,您也几乎可以肯定通过在该领域重组您的支持代码来获得更多的性能提升(例如,拥有newFunction
整个字符串本身);java.lang.String 在这一点上已经得到了很好的优化。