我是靠谱客的博主 纯情星星,最近开发中收集的这篇文章主要介绍java迭代器和for循环区别_哪一个更有效,一个for-每个循环,还是一个迭代器?...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果您只是在集合中徘徊以读取所有的值,那么使用迭代器和新的for循环语法没有什么区别,因为新的语法只是在水下使用迭代器。

但是,如果您指的是旧的“c样式”循环:for(int i=0; i

Object o = list.get(i);}

然后,新的for循环或迭代器可能会更高效,这取决于底层的数据结构。原因是对于某些数据结构,get(i)是O(N)操作,使循环成为O(N)2)手术。传统的链表就是这种数据结构的一个例子。所有迭代器的基本要求是next()应该是O(1)操作,使循环O(N)。

要验证新的for循环语法在水下使用迭代器,请比较以下两个Java片段中生成的字节码。首先是for循环:List  a = new ArrayList();for (Integer integer : a){

integer.toString();}// Byte code

ALOAD 1

INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;

ASTORE 3

GOTO L2

L3

ALOAD 3

INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;

CHECKCAST java/lang/Integer

ASTORE 2

ALOAD 2

INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;

POP

L2

ALOAD 3

INVOKEINTERFACE java/util/Iterator.hasNext()Z

IFNE L3

第二,迭代器:List  a = new ArrayList();for (Iterator iterator = a.iterator(); iterator.hasNext();){

Integer integer = (Integer) iterator.next();

integer.toString();}// Bytecode:

ALOAD 1

INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;

ASTORE 2

GOTO L7

L8

ALOAD 2

INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;

CHECKCAST java/lang/Integer

ASTORE 3

ALOAD 3

INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;

POP

L7

ALOAD 2

INVOKEINTERFACE java/util/Iterator.hasNext()Z

IFNE L8

正如您所看到的,生成的字节代码实际上是相同的,因此使用这两种格式都不会造成性能损失。因此,您应该选择对您最有吸引力的循环的形式,对于大多数人来说,这将是for-每一个循环,因为它有较少的样板代码。

最后

以上就是纯情星星为你收集整理的java迭代器和for循环区别_哪一个更有效,一个for-每个循环,还是一个迭代器?...的全部内容,希望文章能够帮你解决java迭代器和for循环区别_哪一个更有效,一个for-每个循环,还是一个迭代器?...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部