2016-03-23 9 views
12

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

Я думаю, что использование строк 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

"* хранит пул с единственной копией каждой строки *" это неверно. Единственными строками Java-стажеров (если вы не называете 'String.intern()'), являются '' цитируемые ''константы в вашем коде. Строки, созданные во время выполнения, * не * интернированы в пуле констант. – dimo414

+0

Вы правы, те, на которых я ссылался, я отредактирую –

ответ

7

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

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

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

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

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

2

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

+2

, почему вы имеете в виду, что локальные переменные быстрее статики ??? –

+0

@Xoce 웃 Пepeúpa локальная переменная, вероятно, будет немного быстрее, чем доступ к нефинальному 'статическому' поле. Однако константы могут быть встроены, поэтому разница условна. –

+0

Локальная переменная может быть очень хорошо оптимизирована. в некоторых случаях его можно устранить. в других он может быть доступен с помощью очень быстрых инструкций, которые работают с релятивистами к стеку или указателю базы. статические переменные всегда должны быть доступны, используя их полный адрес – loonytune

 Смежные вопросы

  • Нет связанных вопросов^_^