【发布时间】:2009-12-11 05:13:54
【问题描述】:
在循环内声明一个变量是好的还是在 Java 中动态声明最佳。在循环内声明时是否涉及任何性能成本?
例如。
选项 1:在循环之外
List list = new ArrayList();
int value;
//populate list
for(int i = 0 ; i < list.size(); i++) {
value = list.get(i);
System.out.println(“value is ”+ value);
}
选项 2:循环内部
List list = new ArrayList();
//populate list
for(int i = 0; i < list.size(); i++) {
int value = list.get(i);
System.out.println(“value is ”+ value);
}
【问题讨论】:
-
我的理解是选项 1 只会创建和使用单个内存地址,而选项 2 将为列表中的许多项目创建内存地址。
-
我认为像这样的原始数据类型在本地声明时会出现在 VM 堆栈上。如果是这样,则性能没有差异——
int value是通过在堆栈帧中保留一个字来“分配”的。 -
你的理解是错误的。从语义上讲,您可以将其视为在每次循环迭代开始时“分配”一个新的局部变量,然后在结束时“释放”它 - 因此,有理由认为,您永远不会有多个本地“分配” ”。在实践中,它将一直是堆栈上的单个内存位置(甚至可能是单个寄存器)。
-
所有数据类型在本地声明时进入堆栈,无论是否原始。非原始类型是引用类型,reference 进入堆栈。对于堆上的任何东西,某个地方的某个人必须
new它(或使用数组初始化器或字符串文字)。 -
注意:编写的示例会产生编译错误,因为原始
ArrayList上的get方法将返回Object而不是int。
标签: java performance loops