Java - это язык ООП, который имеет несколько встроенных классов и методов для различных целей. Одним из таких примеров является класс String
. Длина метода length()
определяет длину строки. Например,
String str = "hello";
for(int i=0;i<str.length();i++)
{
//code
}
Здесь условие оценивается, если переменная я меньше длины строки, затем цикл итерации. Но определяет ли он длину каждый раз?
Является ли метод length()
, вызываемым каждый раз перед вычислением условия? Если это так, то сохраняет ли Java значение переменной внутри реестра для быстрого доступа (или) программист должен сделать это явно следующим образом:
String str = "hello";
int len = str.length();
for(int i=0;i<len;i++)
{
//code
}
Насколько эффективен такой подход?
Современный JIT, вероятно, заметит, что length() - это простой getter конечного класса, возвращающий окончательное примитивное значение и заменяющий вызов метода самим значением int. Уклонение оптимизации верно для C, среди других языков, но не для java. C strlen перемещает массив символов, который ищет символ конца строки.
int len = str.length();
,
String#length
просто относится к переменной. Ничего больше. Структура выглядит так:
class String {
private int length;
public int length() {
return length;
}
}
Строки неизменны, поэтому нет причин для его изменения в первую очередь; единственный раз, когда нужно вычислить длину, это когда создается String
.
Обычная практика для выполнения вычислений, когда это необходимо, обновляет переменную size
, а затем ссылается на геттер для этого, когда вам нужно получить размер. Таким образом, вы не теряете время, вычисляя размер, когда он не изменился. Вы можете видеть это в ArrayList
Что касается оптимизации "под капотом", это зависит от реализации виртуальной машины, а также от выполняемого кода. Может выполняться инкабилизация, а также оптимизация времени выполнения. Но, в конце концов, это зависит от кода и виртуальной машины.
String
). length()
просто ссылается на переменную, которая содержит размер. length()
считается методом получения (или методом доступа)
i < str.length()
цикл первым способом (i < str.length()
). Возможны два варианта оптимизации: 1) Компилятор уже может оптимизировать этот код, поскольку строка является окончательной, а метод длины ссылается на конечную переменную экземпляра. 2) Современная JVM использует компиляцию точно в срок (JIT). Это также может оптимизировать вызовыString.length()
.length
вызова вычислять размерString
каждом вызове, или он просто вернет число без каких-либо вычислений после первого вызова.