Какой подход быстрее при переборе строк в Java и почему? - PullRequest
1 голос
/ 14 октября 2011

Я проходил этот вопрос , и один из ответов дал 2 варианта и сказал, что первый, вероятно, быстрее.

Хотелось бы узнать почему?

2 варианта, упомянутых в ответе:

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

или

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

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

Второй предложенный ответ создает массив char и повторяет его.Этот механизм, вероятно, медленнее из-за дополнительных издержек при создании массива перед его итерацией;эти издержки соотносятся с длиной строки.

Третий метод, не упомянутый в ответе, на который вы ссылались, включает использование StringCharacterIterator;например,

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

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

Однако я бы предпочел использовать первое основанное на индексах решение в ответе, который вы указали.

0 голосов
/ 14 октября 2011

Это медленно:

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.Итераторы всегда быстрее, чем простой цикл (за исключением некоторых странных случаев, когда итераторы выполняют сложную логику или ресурсоемкую работу)

Но лучше использовать этот класс итераторов символов в другом посте здесь.

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...