繁体   English   中英

迭代 java 集合的性能有效方法是什么?

[英]what is the performance efficient method for iterate java collection?

我想了解迭代器设计模式并在以下教程中找到。

http://www.journaldev.com/1716/iterator-design-pattern-in-java-example-tutorial

以下是hasNext()next()方法的代码。

@Override
public boolean hasNext() {
    while (position < channels.size()) {
        Channel c = channels.get(position);
            if (c.getTYPE().equals(type) ||     type.equals(ChannelTypeEnum.ALL)) {
                return true;
            } else
                position++;
        }
    return false;
}

@Override
public Channel next() {
    Channel c = channels.get(position);
    position++;
    return c;
}

并使用上面的方法集合迭代是

while (baseIterator.hasNext()) {
    Channel c = baseIterator.next();
    System.out.println(c.toString());
}

如果我们使用hasNext()next()方法,看起来我们使用了两次 while 循环。

当应用程序足够小并且性能是优先考虑时,这可以吗? 或者可以优化代码?

Iterator的性能取决于其实现。 每个Java集合都有自己的迭代器实现,因此性能会有所不同。 通常, hasNextnext方法没有循环。 您显示的代码是本教程中的一些特殊迭代器,在执行过滤时会进行迭代。 当您有两个嵌套循环时,实际上您只遍历了基础收集channels一次,因为position不断从0增加到channels.size() hasNext()内部循环对于跳过不需要的项目是必需的,但不会增加计算难度。 这种迭代的总难度为O(channels.size())

请注意,此迭代器实现破坏了Iterator接口协定。 首先,它不会在迭代结束时抛出NoSuchElementException 第二,如果你调用next()几次不调用hasNext()你会有不同的结果。 因此,我不建议您在真实代码中使用本教程中的示例。

“两次使用while循环”是什么意思? 如果您担心是否要对整个集合进行两次迭代,那么对我来说似乎并非如此。 迭代器保留一个位置指针,在这两种方法中似乎都只是前进。 因此,尽管您确实有嵌套循环(在应用程序代码中一个,在hasNext()方法中),但它们不会获取相同的项

馆藏

如果channels是某种Iterable ,则可以将循环编写为

for(Channel c : channels) {
  if(c.getTYPE().equals(type) 
    || type.equals(ChannelTypeEnum.ALL)) {
       return true;
  }
}
return false;

如果仅将位置用于迭代到下一个元素,则无需增加位置。

这只是简写-如注释中所述使用迭代器的代码-因此它在性能方面不会获得太多好处,但可以使您的代码更加清晰。 如果您的channels类型已经 Collection且实现了Iterable ,则不必像上面的代码中那样实现自己的迭代器

这是迭代 Set 的最快方法:

int size = mySet.size();
Iterator<Integer> iteration = mySet.iterator();
for(int j = 0; j < size; j ++){
   doSomethingWith(iteration.next());
}

在此循环中,您避免在每一步都调用 iteration.hasNext(),这就是为什么它比传统的迭代器循环更快,并且比增强的 for 循环更快。

当然,差异非常小,只有当性能对您的代码非常重要时,您才应该这样优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM