Java - 遍历String的最有效方法

Zch*_*yvr 6 java string

可能重复:
在Java中迭代字符串字符的最简单/最好/最正确的方法是什么?

我正在考虑的是时间和效率.考虑到这些,哪种方法(在下面的方法或其他未提及的方法)是最有效的方法来遍历字符串的每个字符?

String str = "Foo Bar";
for(int i=0;i<str.length();i++)
   System.out.println(str.charAt(i)); // access the character using .charAt()

for(char letter: str.toCharArray)
   System.out.println(letter);       // use for-each loop with the char array.
Run Code Online (Sandbox Code Playgroud)

同样,可能有更好的方法来做到这一点,但我也很好奇上面两者之间是否存在重大的时间/资源差异.

Ósc*_*pez 11

第一个版本效率更高.代码的第二个版本最终会慢于使用,因为创建和填充新的成本更多的内存char[]使用toCharArray().

对于长字符串(超过512个字符,约),检查字符串的最快方法是使用反射来访问后盾char[]String(但只工作到Java的8,因为紧凑的字符串):

String data = "a really long string";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] chars = (char[]) field.get(data);

for (int i = 0, n = chars.length; i < n; i++)
    System.out.println(chars[i]);
Run Code Online (Sandbox Code Playgroud)

通过使用上述方法,我们能够完全避免创建新的需求,char[]并且还可以charAt()在每次迭代中支付额外方法调用的成本.

看看这篇文章,答案中包含详细的基准测试.两个世界中最好的,但无论如何它是一个黑客,它不再有效.