Java循环问题

One*_*mir 4 java for-loop

Object[] objs = new Object[5];
for (int i = 0; i < 5; ++i) {
    int j = i + 1;
    Object obj = objs[i];
}
Run Code Online (Sandbox Code Playgroud)

我对上面的循环有两个问题:

  1. 是为每个循环迭代创建j变量和obj引用,还是只创建一次然后只重新分配值?
  2. 是否有任何性能优势,++i而不是i++作为单个指令来增加值?

MBy*_*ByD 7

是为每个循环迭代创建了j变量和obj引用,还是只创建了一次,然后只重新赋值?

每次都声明和创建

将++ i而不是i ++作为单个指令来增加值是否有任何性能优势?

并不是的.

  • 一点都不.变量应在尽可能狭窄的范围内声明. (5认同)
  • 不,因为它们的预留位置是一种廉价的操作,而IMO,编写正确而清晰的代码更为重要. (3认同)
  • 请记住,声明变量与实例化对象不同.在循环外部放置"int j"和"Object obj"声明不会保存任何内存或CPU周期,相反,对象会在内存中保留更长时间直到块结束,而不是直到for循环结束. (2认同)

ass*_*ias 6

是为每个循环迭代创建了j变量和obj引用,还是只创建了一次,然后只重新赋值?

每次循环时,都会创建一个新的int,但obj只是对现有对象的引用,因此不会触发对象创建.无论如何,JVM很可能会为您优化.

将++ i而不是i ++作为单个指令来增加值是否有任何性能优势?

最有可能的是,JVM可能无论如何都会改变你的代码.

底线:使用更具可读性的内容,并将变量的范围限制在使用它们的位置.

实际上,JVM可能会将您的代码更改为此,因为您不在循环中使用局部变量:

Object[] objs = new Object[5];
//for (int i = 0; i < 5; ++i) {
//    int j = i + 1;
//    Object obj = objs[i];
//}
Run Code Online (Sandbox Code Playgroud)