您好,欢迎访问一九零五行业门户网

Java循环中的For和For-each应用对比分析

for-each实现方法for-each不是一种新语法,而是java的语法糖。在编译时,编译器将此代码转换为迭代器实现,并将其编译为字节码。我们可以通过执行命令javap-verbose-testforeach反编译以下编译代码:
public class testforeach { list<integer> integers; public void testforeach(){ for(integer i : integers){ } }}
获得的详细字节码如下:
public void testforeach(); descriptor: ()v flags: acc_public code: stack=1, locals=3, args_size=1 0: aload_0 1: getfield #2 // field integers:ljava/util/list; 4: invokeinterface #3, 1 // interfacemethod java/util/list.iterator:()ljava/util/iterator; 9: astore_1 10: aload_1 11: invokeinterface #4, 1 // interfacemethod java/util/iterator.hasnext:()z 16: ifeq 32 19: aload_1 20: invokeinterface #5, 1 // interfacemethod java/util/iterator.next:()ljava/lang/object; 25: checkcast #6 // class java/lang/integer 28: astore_2 29: goto 10 32: return linenumbertable: line 11: 0 line 13: 29 line 14: 32 localvariabletable: start length slot name signature 29 0 2 i ljava/lang/integer; 0 33 0 this ltest/testforeach;}
此字节码的一般含义是使用getfileld命令来获取integers变量并且调用list.iterator来获取迭代器实例和调用iterator.hasnext。如果返回true,调用iterator.next方法。
请看,这是迭代器遍历集合的实现逻辑。
基准测试现在让我们使用for循环方法和for-each方法进行测试。
public class forlooptest { public static void main(string[] args) { list<integer> arraylist = new arraylist<>(); for (int i = 0; i < 10000000; i++) { arraylist.add(i); } long arrayliststarttime = system.currenttimemillis(); for (int i = 0; i < arraylist.size(); i++) { arraylist.get(i); } long arraylistcost =system.currenttimemillis()-arrayliststarttime; system.out.println("arraylist for loop traversal cost: "+ arraylistcost); long arraylistforeachstarttime = system.currenttimemillis(); for (integer integer : arraylist) { } long arraylistforeachcost =system.currenttimemillis()-arraylistforeachstarttime; system.out.println("arraylist foreach traversal cost: "+ arraylistforeachcost);
这是测试结果:
如你所见,结果是显而易见的。使用for循环方法比for each方法在arraylist上表现更为高效。
我们可以说for循环比for-each好吗?
答案是否定的。在下一个基准测试中,我们将arraylist更改为linkedlist。
同样,这里是测试结果。
原因分析一些初学者可能想知道为什么arraylist使用for循环方法遍历得更快,而linkedlist则更慢,速度也非常慢?
这由arraylist和linkedlist数据结构决定。
arraylist底层使用数组存储元素。数组是连续的内存空间。数据可以通过索引获得。时间复杂度为o(1),因此速度很快。
linkedlist的底层是一个双向链表。使用for循环实现遍历,每次都需要从链表的头节点开始。时间复杂度为o(n*n)。
结论使用arraylist时,for循环方法更快,因为for-each由迭代器实现,并且需要执行并发修改验证。
使用linkedlist时,for-each比for循环快得多,因为linkedlist是通过使用双向链表实现的。每个寻址都需要从头节点开始。遍历linkedlist时,避免使用for循环。
使用迭代器模式,for-each不需要关心集合的具体实现。如果需要替换集合,无需修改代码即可轻松替换。
以上就是java循环中的for和for-each应用对比分析的详细内容。
其它类似信息

推荐信息