[英]Performance: create collection from scratch or iterate and add missing? (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集合都有自己的迭代器实现,因此性能会有所不同。 通常, hasNext
和next
方法没有循环。 您显示的代码是本教程中的一些特殊迭代器,在执行过滤时会进行迭代。 当您有两个嵌套循环时,实际上您只遍历了基础收集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.