0

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

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

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

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

7 回答 7

5
  • 是的。他们两个完全没用。
  • 不会。由于成员变量,Class1 的实例大小大于 Class2 的实例大小。

答案取决于你说“相等”的意思=)

于 2009-10-16T08:41:49.650 回答
4

不,它不会。

在第一种情况下,您已经为一个变量分配了 1000 个不同的值 - 在构造函数完成后,您最终能够获得最后一个值 (999)。

在第二种情况下,您将调用本质上无操作的方法 1000 次。第二种方法没有副作用,也没有返回值,所以没用。局部变量仅在方法调用期间“存在”,而第一个示例中的实例变量是对象的一部分,因此将继续存在。

请注意,这不仅限于原语 - 任何其他类型的行为也一样。

于 2009-10-16T08:39:22.690 回答
3

没有

  • Class1变量中a有一个字段,类中的所有方法都可以访问。
  • Class2这种情况下不是这样:a是方法中的局部变量assign。完成后,丢弃assign的值。a
于 2009-10-16T08:38:58.370 回答
2

不,一个有一个实例变量a(Class1),一个没有。

于 2009-10-16T08:39:11.370 回答
0

在第一个实例中,您已经将 b 声明为 int 并且每次循环执行时都会更新其值。第二,每次循环执行时,b 被声明并初始化为 i 的值。我不是 100% 确定,但我认为第二种情况更占用内存,但我认为速度差异不会很明显。

于 2009-10-16T12:07:08.180 回答
0

值得注意的是,任何值得其盐分的编译器,而且我坚信 JIT 值得大量盐分,在第二种情况下只会为“b”ONCE 留出空间,即“声明”阶段将毫无意义。

于 2009-10-16T18:30:23.227 回答
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;
                          ^

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

于 2009-10-16T18:33:53.113 回答