因为我的坏例子而编辑了这个问题。这是我更新的问题:
以下内容在速度和内存分配方面是否相同:
int b;
for (int i = 0; i < 1000; i++)
b = i;
和
for (int i = 0; i < 1000; i++)
int b = i;
答案 0 :(得分:5)
答案取决于你所说的“平等”=)
答案 1 :(得分:4)
不,它不会。
在第一种情况下,您为一个变量分配了1000个不同的值 - 并且您最终能够在构造函数完成后获得最后一个值(999)。
在第二种情况下,您调用的是基本上无操作的方法1000次。第二种方法没有副作用,没有返回值,所以没用。局部变量仅在方法调用期间“存在”,而第一个示例中的实例变量是对象的一部分,因此将继续存在。
请注意,这不仅限于基元 - 任何其他类型的行为也会相同。
答案 2 :(得分:3)
否强>
Class1
中,变量a
是一个字段,可供类中的所有方法访问。Class2
中并非如此:a
是方法assign
中的局部变量。 assign
完成后,a
的值将被丢弃。 答案 3 :(得分:2)
不,有一个实例变量a
(Class1),而其中一个没有。
答案 4 :(得分:0)
在第一个实例中,您已经将b声明为int,并且每次循环执行时都会更新其值。在第二个中,每次循环执行时,b被声明并初始化为i的值。我不是100%肯定,但我认为第二种情况是内存密集,但我不认为速度差异会很明显。
答案 5 :(得分:0)
值得注意的是,任何值得信赖的编译器,我坚信JIT值得花很多钱,只会在第二种情况下为“b”ONCE留出空间,即“声明”阶段将毫无意义
答案 6 :(得分:0)
你试过这个吗?它甚至没有编译!
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;
^
循环体必须包含至少一个语句。变量声明不是语句,因此只包含变量声明的循环无效。