关于原语的快速问题

时间:2009-10-16 08:36:50

标签: java primitive

因为我的坏例子而编辑了这个问题。这是我更新的问题:

以下内容在速度和内存分配方面是否相同:

int b;
for (int i = 0; i < 1000; i++)
    b = i;

for (int i = 0; i < 1000; i++)
    int b = i;

7 个答案:

答案 0 :(得分:5)

  • 是。两者都完全无用。
  • 否。由于成员变量,Class1的实例大小大于Class2的实例大小。

答案取决于你所说的“平等”=)

答案 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;
                          ^

循环体必须包含至少一个语句。变量声明不是语句,因此只包含变量声明的循环无效。