集合迭代:对于语法与迭代器:重用临时变量

时间:2014-02-27 19:34:55

标签: java for-loop iterator

问题:

就效率而言,必须为每个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很旧,它增加了几个演员,但差异是可见的。

Decompiled For Loop

        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()));

3 个答案:

答案 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);
}