Java выполняет внутреннюю оптимизацию?

1

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
} 

Насколько эффективен такой подход?

  • 0
    Просто чтобы дополнить ответ (ы): i < str.length() цикл первым способом ( i < str.length() ). Возможны два варианта оптимизации: 1) Компилятор уже может оптимизировать этот код, поскольку строка является окончательной, а метод длины ссылается на конечную переменную экземпляра. 2) Современная JVM использует компиляцию точно в срок (JIT). Это также может оптимизировать вызовы String.length() .
  • 0
    @Seelenvirtuose Он не спрашивает об оптимизации накладных расходов от вызовов методов. Он спрашивает, будет ли length вызова вычислять размер String каждом вызове, или он просто вернет число без каких-либо вычислений после первого вызова.
Теги:
optimization

2 ответа

2

Современный JIT, вероятно, заметит, что length() - это простой getter конечного класса, возвращающий окончательное примитивное значение и заменяющий вызов метода самим значением int. Уклонение оптимизации верно для C, среди других языков, но не для java. C strlen перемещает массив символов, который ищет символ конца строки.

  • 0
    @VinceEmigh в C, лучше хранить результат strlen () в переменной, а не вызывать его на каждой итерации, тогда как в Java нет необходимости хранить результат string.length (). 1. потому что string.length () не нужно перебирать все символы строки, как это делает strlen (), 2. потому что JIT оптимизирует вызов метода.
  • 1
    @ VinceEmigh никто ... кроме ОП. Это именно тот вопрос, который он задает: делает ли Java это автоматически или разработчик должен делать это явно: int len = str.length(); ,
Показать ещё 11 комментариев
0

String#length просто относится к переменной. Ничего больше. Структура выглядит так:

class String {
    private int length;

    public int length() {
        return length;
    }
}

Строки неизменны, поэтому нет причин для его изменения в первую очередь; единственный раз, когда нужно вычислить длину, это когда создается String.

Обычная практика для выполнения вычислений, когда это необходимо, обновляет переменную size, а затем ссылается на геттер для этого, когда вам нужно получить размер. Таким образом, вы не теряете время, вычисляя размер, когда он не изменился. Вы можете видеть это в ArrayList

Что касается оптимизации "под капотом", это зависит от реализации виртуальной машины, а также от выполняемого кода. Может выполняться инкабилизация, а также оптимизация времени выполнения. Но, в конце концов, это зависит от кода и виртуальной машины.

  • 0
    String # length () является методом экземпляра класса string @Vince. Как это может быть переменной? Можете ли вы объяснить это подробно с другими примерами
  • 0
    @JavaEnthusiast Проверьте мои изменения. Вместо метода вычисления размера, размер вычисляется только при необходимости (в данном случае, когда создается String ). length() просто ссылается на переменную, которая содержит размер. length() считается методом получения (или методом доступа)
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню