Строки 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
}
}
Ответы
Ответ 1
Использование именованной константы, вероятно, будет лучше для ремонтопригодности. Однако константы, известные во время компиляции, могут быть встроены, и в этом случае вряд ли будет какая-либо разница.
Примечание. Если вы используете строковый литерал, это будет создано только один раз, независимо от того, где в JVM он используется.
В этом случае единственная разница заключается в использовании локальной таблицы в стеке, которая вряд ли будет более дорогой, чем константа, которая была встроена.
действительно ли был бы удар по производительности, связанный с необходимостью объявления переменной каждый раз при обращении к методу
Поскольку Java использует статический компилятор, переменная объявляется только один раз (или один раз для каждого этапа компиляции) при загрузке класса/метода, независимо от того, сколько раз вызываются методы. Однако переменная может быть инициализирована каждый раз.
Ответ 2
Истина заключается в том, что в конце нет никакой разницы. Постоянная строка в локальной переменной по-прежнему будет в конечном пуле и оптимизирована. Так что, вообще говоря, локальные переменные быстрее, потому что их легче получить, но в случае постоянных строк это не имеет значения. Поэтому выберите то, что более читаемо и интуитивно понятно в вашем случае.