Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代java集合的高效性能方法是什么?_Java_Collections_Iterator - Fatal编程技术网

迭代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;