我正在经历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
}
答案 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编译器很好地进行优化。 迭代器总是比简单循环更快(除了一些奇怪的情况,迭代器执行复杂的逻辑或资源饥饿的工作)
但最好在此处的其他帖子中使用该字符迭代器类。
问候