В Java для строки x какова стоимость выполнения s.length ()? Это O (1) или O (n)? - PullRequest
30 голосов
/ 31 октября 2008

Мне сказали, что такой код:

for (int i = 0; i < x.length(); i++) {
    // blah
}

на самом деле O (n ^ 2) из-за повторных вызовов x.length(). Вместо этого я должен использовать:

int l = x.length();
for (int i = 0; i < l; i++) {
    // blah
}

Это правда? Сохраняется ли длина строки как закрытый целочисленный атрибут класса String? Или String.length() действительно обходит всю строку, только чтобы определить ее длину?

Ответы [ 7 ]

54 голосов
/ 31 октября 2008

Нет, длина строки java равна O (1), поскольку класс строки java хранит длину в виде поля.

Совет, который вы получили, верен для C, среди других языков, но не для java. C's strlen обходит массив char в поисках символа конца строки. Джоэл говорил об этом на подкасте, но в контексте C.

12 голосов
/ 01 ноября 2008

Вопреки сказанному, нет гарантии, что String.length() - это операция с постоянным временем в количестве символов, содержащихся в строке. Ни в javadoc для класса String, ни в спецификации языка Java не требуется, чтобы String.length была операцией с постоянным временем.

Однако в реализации Sun String.length() - это операция с постоянным временем. В конечном счете, трудно представить, почему любая реализация имеет реализацию с непостоянным временем для этого метода.

5 голосов
/ 01 ноября 2008

String хранит длину в отдельной переменной. Поскольку строка неизменна, длина никогда не изменится. Ему нужно будет рассчитать длину только один раз при ее создании, что происходит, когда для нее выделяется память Следовательно, его O (1)

4 голосов
/ 01 ноября 2008

Если вы не знали, что можете написать это так:

for (int i = 0, l = x.length(); i < l; i++) {
    // Blah
}

Это немного чище, так как область действия l меньше.

4 голосов
/ 01 ноября 2008

Вы должны знать, что метод length() возвращает количество кодовых точек UTF-16, которое не обязательно совпадает с количеством символов во всех случаях.

Хорошо, шансы на то, что это действительно повлияет на вас, довольно невелики, но знать об этом нет никакого вреда.

0 голосов
/ 31 октября 2008

Я не знаю, насколько хорошо будет переводиться ссылка, но вижу источник String#length. Короче говоря, #length() имеет сложность O (1), потому что он просто возвращает поле. Это одно из многих преимуществ неизменяемых струн.

0 голосов
/ 31 октября 2008

Согласно this длина представляет собой поле объекта String.

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