Подтвердить что ты не робот

Строки Java: частные статические и локальные переменные производительности

Есть ли какое-либо преимущество в производительности с помощью private final static String в java vs с использованием локальной строковой переменной, которая должна "инициализироваться" при каждом обращении к методу?

Я действительно думаю, что использование строк private static final является хорошей практикой для констант, которые используются повторно в разных частях класса, однако если строка должна использоваться только одним методом в одном месте по очень определенной причине что никакого другого метода не беспокоит, я на самом деле предпочитаю, чтобы внутренний класс класса был чистым с менее частными членами и просто использовал локальную переменную.

Учитывая, что java имеет интернирование строк, и фактически сохраняет пул с единственной копией каждой строки, которая объявляется с использованием кавычек (String s = "some string"), действительно ли было бы поражение производительности от необходимости объявлять/инициализировать/назначать переменную каждый раз при обращении к этому методу с использованием статической строки?

Чтобы сделать его более понятным, будет ли разница между использованием SS или LS?

class c {
private final static String SS = "myString";

  private void method(){
     //do something with SS
  }

  private void OtherMethod(){
     String LS = "myOtherString"
     //do same thing with LS
  }
}
4b9b3361

Ответ 1

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

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

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

действительно ли был бы удар по производительности, связанный с необходимостью объявления переменной каждый раз при обращении к методу

Поскольку Java использует статический компилятор, переменная объявляется только один раз (или один раз для каждого этапа компиляции) при загрузке класса/метода, независимо от того, сколько раз вызываются методы. Однако переменная может быть инициализирована каждый раз.

Ответ 2

Истина заключается в том, что в конце нет никакой разницы. Постоянная строка в локальной переменной по-прежнему будет в конечном пуле и оптимизирована. Так что, вообще говоря, локальные переменные быстрее, потому что их легче получить, но в случае постоянных строк это не имеет значения. Поэтому выберите то, что более читаемо и интуитивно понятно в вашем случае.