哪一个更有效,一个for-每个循环,还是一个迭代器

哪一个更有效,一个for-每个循环,还是一个迭代器?

哪一种方式是遍历集合最有效的方法?

List<Integer>  a = new ArrayList<Integer>();for (Integer integer : a) {
  integer.toString();}

List<Integer>  a = new ArrayList<Integer>();for (Iterator iterator = a.iterator(); iterator.hasNext();) {
   Integer integer = (Integer) iterator.next();
   integer.toString();}

请注意,这不是与这,这个这,这个这,这个,或这,这个虽然最后一个问题的答案之一已经接近尾声。这不是一个欺骗的原因,因为其中大多数都是比较循环,您在其中调用。get(i)循环内部,而不是使用迭代器。

如上所建议的我将张贴我对这个问题的答案。


慕田峪7331174
浏览 721回答 3
3回答

繁花如伊

区别不在于性能,而在于能力。当直接使用引用时,您比显式使用迭代器(例如List.iterator()与List.listIterator(),尽管在大多数情况下它们返回相同的实现)更强大。您还可以在循环中引用Iterator。这允许您在不获取ConcurrentModificationException的情况下从集合中删除项。G.这没问题:Set<Object>&nbsp;set&nbsp;=&nbsp;new&nbsp;HashSet<Object>();//&nbsp;add&nbsp;some&nbsp;items&nbsp;to&nbsp;the&nbsp;setIterator<Object>&nbsp;setIterator&nbsp;=&nbsp;set.iterator();while(setIterator.hasNext()){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o&nbsp;=&nbsp;setIterator.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(o&nbsp;meets&nbsp;some&nbsp;condition){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setIterator.remove(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}这不是,因为它将引发并发修改异常:Set<Object>&nbsp;set&nbsp;=&nbsp;new&nbsp;HashSet<Object>();//&nbsp;add&nbsp;some&nbsp;items&nbsp;to&nbsp;the&nbsp;setfor(Object&nbsp;o&nbsp;:&nbsp;set){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(o&nbsp;meets&nbsp;some&nbsp;condition){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.remove(o); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}

慕仙森

为了扩展Paul自己的答案,他已经证明了字节码在特定的编译器上是相同的(大概是Sun的javac?)但是不同的编译器不是保生成相同的字节码,对吗?为了了解两者之间的实际区别,让我们直接进入源代码,检查Java语言规范,特别是14.14.2,“强化陈述”:增强for语句等效于基本语句。for表格说明:for&nbsp;(I&nbsp;#i&nbsp;=&nbsp;Expression.iterator();&nbsp;#i.hasNext();&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;VariableModifiers(opt)&nbsp;Type&nbsp;Identifier&nbsp;=&nbsp;#i.next();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;}换句话说,JLS要求两者是等价的。从理论上讲,这可能意味着字节码的边际差异,但实际上,增强的for循环需要:调用.iterator()方法使用.hasNext()通过以下方式使局部变量可用.next()因此,换句话说,就所有实际目的而言,字节码将是相同的,或几乎相同的。很难想象编译器实现会导致两者之间的任何显著差异。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go