就效率而言,必须为每个for
循环重新创建一个引用变量似乎完全错误。
有没有办法做类似的事情:
Item i;
for (i : list2)
另外,创建临时引用变量会产生多大的影响吗?
请参阅下面的原始代码 vs 旧迭代器样式:
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很旧,它增加了几个演员,但差异是可见的。
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()));
答案 0 :(得分:2)
就效率而言,必须为每个for循环重新创建一个引用变量
除非您的应用程序对速度优化有极大的需求,否则每次迭代创建临时引用并丢弃它们都没有缺点。 JVM非常善于处理这些事情。
创建临时引用变量会产生多大的影响吗?
不,你不应该关注这种微观优化,这几乎不值得麻烦。专注于编写可读和清晰的代码而不是担心这些事情。此外,如果JVM更有效,它很可能会内联它们。
答案 1 :(得分:2)
问题:
就效率而言,必须为每个for循环重新创建一个引用变量似乎完全错误。
错误。变量实际上并不存在。它们是一种抽象,可以让你命名。如果变量具有将来可能使用的值,则它将位于存储器或寄存器中的地址。在其有用的范围之后,编译器可能(并且可能将)重用先前用于该变量的地址或寄存器。
有没有办法做类似的事情:
Item i;
for (i : list2)
不,快速迭代中的变量必须是const,因此不能事先声明它。
另外,创建临时引用变量会产生多大的影响吗?
正如我所说,变量实际上并不存在,所以不,无论是声明新变量还是重用旧变量都没有区别。
我建议你参加一个编译器课程,他们对这样的事情非常有启发性。
答案 2 :(得分:1)
Java通常会有效地处理临时引用变量。
我认为处理超大型列表时效率更高的问题是将它分成单独的列表,然后在最后添加它们。下面的内容可能更有效。
int index0 = 0;
int index1 = 0;
for (Item i : DataStore.SomeList) {
if (someBoolean)continue;
if (someBoolean2) {
finalList.add(index0);
index0++;
index1++;
}
else if (someBoolean3){
finalList.add(index1);
index1++;
}
else
finalList.add(i);
}