在Java中迭代字符串时,哪种方法更快?为什么?

时间:2011-10-14 11:40:41

标签: java string

我正在经历this question,其中一个answers提供了两个选项,并说第一个可能更快。

我想知道为什么?

答案中提到的2个选项是

for(int i = 0, n = s.length() ; i < n ; i++) { 
    char c = s.charAt(i); 
}

for(char c : s.toCharArray()) {
    // process c
}

2 个答案:

答案 0 :(得分:4)

建议的第二个答案是创建一个char数组并对其进行迭代。这种机制可能更慢,因为在迭代之前创建数组会产生额外的开销;这个开销与String的长度相关。

您引用的答案中未提及的第三种方法涉及使用StringCharacterIterator; e.g。

CharacterIterator it = new StringCharacterIterator("Hello, World");
char c;

while ((c = it.next()) != CharacterIterator.DONE) {
  System.err.println("Char: " + c);
}

但是,我个人的偏好是在你引用的答案中使用第一个基于索引的解决方案。

答案 1 :(得分:0)

这很慢:

for(int i = 0, n = s.length() ; i < n ; i++) { 
    char c = s.charAt(i); 
}

但可以像这样更快: int length = s.length();

for(int i = 0, n = length ; i < n ; ++i) { 
    char c = s.charAt(i); 
}

差异在哪里: - 将长度提取到变量以防止一次又一次地重新计算。 - ++ i比i ++更快,因为它不需要时间变量和垃圾收集。

这更快:

for(char c : s.toCharArray()) {
    // process c
}

因为它使用了迭代器,并且可以通过Java编译器很好地进行优化。 迭代器总是比简单循环更快(除了一些奇怪的情况,迭代器执行复杂的逻辑或资源饥饿的工作)

但最好在此处的其他帖子中使用该字符迭代器类。

问候