6

可能重复:
在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.

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

4

2 回答 2

11

第一个版本效率更高。由于创建和填充新char[]toCharArray().

对于长字符串(大约超过 512 个字符),检查字符串的最快方法是使用反射来访问支持char[]String(但仅适用于 Java 8,因为Compact Strings):

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]);

通过使用上述方法,我们能够完全避免创建新方法的需要,也无需支付每次迭代中char[]额外调用方法的成本。charAt()

看看这篇文章,答案包含详细的基准。两全其美,但无论如何它是一个黑客,它不再有效。

于 2012-11-09T01:03:08.167 回答
1

第一种方法更快,因为toCharArray必须在返回任何内容之前复制字符串的内部字符数组,而charAt直接访问此内部数组中的元素,使其更有效。

换句话说,charAtO(1)toCharArrayO(n)。现在,这两种遍历字符串的方法都是O(n),但第二种方法的“领先系数”比第一种方法高。

如果您查看该类的源代码,您可以看到所有这些。String

于 2012-11-09T01:01:14.027 回答