迭代java集合的高效性能方法是什么?
我想了解迭代器设计模式,并在下面的教程中找到 下面是迭代java集合的高效性能方法是什么?,java,collections,iterator,Java,Collections,Iterator,我想了解迭代器设计模式,并在下面的教程中找到 下面是hasNext()和next()方法的代码 @Override public boolean hasNext() { while (position < channels.size()) { Channel c = channels.get(position); if (c.getTYPE().equals(type) || type.equals(ChannelTypeEnum.
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;
}
如果我们使用的是hasNext()
和next()
方法,看起来我们使用了两次while循环
当应用程序足够小且性能是首要任务时,这样可以吗?或者可以有优化的代码?集合 如果
通道
是某种类型的,那么可以将循环编写为
for(Channel c : channels) {
if(c.getTYPE().equals(type)
|| type.equals(ChannelTypeEnum.ALL)) {
return true;
}
}
return false;
如果只在迭代到下一个元素时使用该位置,则无需增加位置
这只是使用迭代器的简写代码,如注释中所述,因此它在性能方面不会获得太多好处,但会增加代码的清晰度。如果
通道
的类型已经是集合
并且实现了Iterable,迭代器的性能取决于它的实现,那么就不必像在上面的代码中那样实现自己的迭代器。每个Java集合都有自己的迭代器实现,因此性能会有所不同。通常hasNext
和next
方法没有循环。您显示的代码是教程中的一些特殊迭代器,它在执行过滤时进行迭代。虽然有两个嵌套循环,但实际上只遍历基础集合通道一次,因为position
不断从0增加到channels.size()
。hasNext()
内部循环是跳过不需要的项所必需的,但它不会增加计算难度。这种迭代的总体难度是O(channels.size())
请注意,此迭代器实现打破了迭代器
接口契约。首先,它不会在迭代结束时抛出NoTouchElementException
。其次,如果您多次调用next()
而不调用hasNext()
,您将得到不同的结果。因此,我不建议在实际代码中使用本教程中的示例。您所说的“使用while循环两次”是什么意思?如果您关心是否在集合上迭代两次,那么在我看来就不是这样了。迭代器保留一个位置指针,在这两种方法中,该指针似乎只向前移动。因此,虽然您确实有嵌套循环(一个在应用程序代码中,在hasNext()方法中),但它们不会获取相同的项这只是使用IteratorTanks@Tagir Valeev进行解释的编译器速记,现在我真的很好奇hasNext()和next()在Java集合中是如何工作的?@AMY,检查Java源代码。例如,ArrayList迭代器。是的,我浏览了您建议的链接。hasNext()方法“return cursor!=size;”中的代码消除了所有疑问。谢谢@sharonbn,我明白你的意思了。位置指针是keep go forward,hasNext()方法中的while循环没有完全迭代。
for(Channel c : channels) {
if(c.getTYPE().equals(type)
|| type.equals(ChannelTypeEnum.ALL)) {
return true;
}
}
return false;