Объявление локальной переменной без инициализирующего выражения не будет работать вообще. Работа происходит, когда переменная инициализируется.
Таким образом, следующее с точки зрения семантики и производительности идентично:
double[] array;
for (int i=0; i<n; ++i) {
array = calculateSomethingAndReturnAnArray(i);
// ...
}
и
for (int i=0; i<n; ++i) {
double[] array = calculateSomethingAndReturnAnArray(i);
// ...
}
(Вы даже не можете отрицать, что первый случай позволяет использовать array
после окончания цикла. Для того, чтобы это было допустимо, array
должен иметь определенное значение после цикла, и он не ' t, если вы не добавите в объявление инициализатор, например double[] array = null;
)
Чтобы развить точку зрения @Mark Elliot о микрооптимизации:
Это действительно попытка оптимизации, а не реальная оптимизация, потому что (как я заметил) это не должно иметь никакого эффекта.
Даже если компилятор Java фактически выпустил некоторый нетривиальный исполняемый код для double[] array;
, есть вероятность, что время выполнения будет незначительным по сравнению с общим временем выполнения тела цикла и приложения в целом. Следовательно, это, скорее всего, бессмысленная оптимизация.
Даже если это стоит оптимизации, вы должны учитывать, что вы оптимизировали ее для конкретной целевой платформы; то есть конкретное сочетание аппаратного обеспечения и версии JVM. Подобные микрооптимизации могут быть неоптимальными на других платформах и теоретически могут быть антиоптимизациями.
Таким образом, вы, скорее всего, тратите время впустую, если при написании кода Java сосредоточитесь на таких вещах. Если производительность является проблемой для вашего приложения, сфокусируйтесь на производительности на уровне MACRO; например такие вещи, как алгоритмическая сложность, хороший дизайн базы данных / запроса, шаблоны сетевых взаимодействий и т. д.