【发布时间】:2014-03-31 11:25:35
【问题描述】:
问题:
就效率而言,必须为每个for 循环重新创建一个引用变量似乎是完全错误的。
有什么办法可以做到:
Item i;
for (i : list2)
另外,创建临时引用变量有那么大的不同吗?
请参阅下面的原始代码与旧迭代器样式:
原码
for (Item i : DataStore.SomeList) {
if (someBoolean)continue;
if (someBoolean2)
finalList.add(i);
else if (someBoolean3)
list1.add(i);
else
list2.add(i);
}
for (Item i : list1)
finalList.add(i);
for (Item i : list2)
finalList.add(i);
旧的迭代器语法
Item i;
Iterator<Item> it = DataStore.SomeList.iterator();
while(it.hasNext())
{
if (someBoolean)continue;
if (someBoolean2)
finalList.add(i);
else if (someBoolean3)
list1.add(i);
else
list2.add(i);
}
it = list1.iterator();
while(it.hasNext())finalList.add(it.next());
it = list2.iterator();
while(it.hasNext())finalList.add(it.next());
更新
使用 JAD 反编译类。由于 JAD 很旧,它添加了一些演员表,但差异是可见的。
反编译的 For 循环
Item i;
for(Iterator iterator1 = list1.iterator(); iterator1.hasNext(); finalList.add(i))
i= (Item)iterator1.next();
Item i;
for(Iterator iterator2 = list2.iterator(); iterator2.hasNext(); finalList.add(i))
i= (Item)iterator2.next();
反编译的迭代器
for(Iterator it = list1.iterator(); it.hasNext(); finalList.add((Application)it.next()));
for(Iterator it = list2.iterator(); it.hasNext(); finalList.add((Application)it.next()));
【问题讨论】:
-
您是否考虑过查看您的两个示例生成的字节码?我想你会find 他们很像。
-
请不要过早优化 - 本地(在堆栈上)创建的变量是 Java 中较小的问题之一... :-)
-
@Elliott Frisch 我已经使用 JAD 反编译了代码,所以我知道 FOR 已转换为迭代器。不过,我会检查编译器是否重用了迭代器。
-
一般来说变量的创建不会影响你的效率。不过,用于生成列表的算法会。