由于我的坏例子而编辑了这个问题。这是我更新的问题:
以下在速度和内存分配方面是否相等:
int b;
for (int i = 0; i < 1000; i++)
b = i;
和
for (int i = 0; i < 1000; i++)
int b = i;
答案取决于你说“相等”的意思=)
不,它不会。
在第一种情况下,您已经为一个变量分配了 1000 个不同的值 - 在构造函数完成后,您最终能够获得最后一个值 (999)。
在第二种情况下,您将调用本质上无操作的方法 1000 次。第二种方法没有副作用,也没有返回值,所以没用。局部变量仅在方法调用期间“存在”,而第一个示例中的实例变量是对象的一部分,因此将继续存在。
请注意,这不仅限于原语 - 任何其他类型的行为也一样。
没有。
Class1
变量中a
有一个字段,类中的所有方法都可以访问。Class2
这种情况下不是这样:a
是方法中的局部变量assign
。完成后,丢弃assign
的值。a
不,一个有一个实例变量a
(Class1),一个没有。
在第一个实例中,您已经将 b 声明为 int 并且每次循环执行时都会更新其值。第二,每次循环执行时,b 被声明并初始化为 i 的值。我不是 100% 确定,但我认为第二种情况更占用内存,但我认为速度差异不会很明显。
值得注意的是,任何值得其盐分的编译器,而且我坚信 JIT 值得大量盐分,在第二种情况下只会为“b”ONCE 留出空间,即“声明”阶段将毫无意义。
你试过这个吗?它甚至没有编译!
for (int i = 0; i < 1000; i++)
int b = i;
来自编译器的错误消息:
Example.java:4: '.class' expected
int b = i;
^
Example.java:4: not a statement
int b = i;
^
Example.java:4: illegal start of expression
int b = i;
^
循环体必须至少包含一条语句。变量声明不是语句,因此只有变量声明的循环是无效的。