java - 循环内外定义变量的区别

标签 java performance coding-style

就风格或性能而言,在循环内或循环外定义变量哪个更好?

例如:

int var;
for (...) {
    var = /*something*/;
    // Code that uses var
}

for (...) {
    int var = /*something*/;
    // Code that uses var
}

如果您对变量声明的内部工作方式有任何见解,以及其中一个如何比另一个表现更好(即使只是稍微好一点),请分享。除了表演之外,哪种风格更受欢迎?

最佳答案

里面

for(int i = 0; i < array.length; i++) {
   final String variable = array[i];
}
  • 限制变量的范围。
  • 变量可以是final
  • 更具可读性(可能)

外面

String variable;
for(int i = 0; i < array.length; i++) {
   variable = array[i];
}
  • 变量可在循环外访问。

对于每个

for(final String variable : array) {
}
  • 只分配一次(需要来源)
  • 限制变量的范围。
  • 看起来太棒了。

性能

运行了以下测试。运行大约需要 30 秒。结果表明,在循环内部或外部定义变量在性能上没有差异。这很可能是由于编译器优化。 YMMV.

final double MAX = 1e7;

long start = System.nanoTime();
String var1;
for(double i = 0; i < MAX; i++) {
   var1 = UUID.randomUUID().toString();
}
System.out.println((System.nanoTime() - start) / 1e9);

start = System.nanoTime();
for(double i = 0; i < MAX; i++) {
   final String var2 = UUID.randomUUID().toString();
}
System.out.println((System.nanoTime() - start) / 1e9);

风格偏好讨论:https://stackoverflow.com/a/8803806/1669208

关于java - 循环内外定义变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29989752/

相关文章:

java - 为什么我会收到 NullPointerException?

java - spring JMX可以在两个不同的bean名称下导出相同的bean实例吗?

java - 我怎样才能返回我的主类?

java - JPA 实体被忽略

python - 将对象保留在内存中并避免重新加载 pickle

python - 动态类型设计 : is recursivity for dealing with lists a good design?

python read() from stdout 比逐行读取慢得多(吞咽?)

ios - iPhone音频资源

c++ - 返回静态本地引用

coding-style - 编写冗长的单行代码是一种不好的做法吗?