原创

普通for循环和foreach循环哪个效率高?

在Java中,循环是一种常见的操作,而循环的效率却可能受到不同的循环方式影响。本文将深入探讨使用普通for循环和foreach循环在ArrayList和LinkedList上的效率对比,以及在不同数据结构下的选择建议。

I. 循环效率对比实验

通过对ArrayList和LinkedList进行10万次和100万次的循环操作,使用普通for循环和foreach循环进行效率对比。

1. 10万次循环

1.1 ArrayList循环

long startTime = System.currentTimeMillis();ArrayList<Integer> arrayList = new ArrayList<>();for (int i = 0; i < 100000; i++) {    // 循环体}long endTime = System.currentTimeMillis();System.out.println("用for循环ArrayList 10万次花费时间:" + (endTime - startTime) + "毫秒");
startTime = System.currentTimeMillis();ArrayList<Integer> arrayList = new ArrayList<>();for (int element : arrayList) { // 循环体}endTime = System.currentTimeMillis();System.out.println("用foreach循环ArrayList 10万次花费时间:" + (endTime - startTime) + "毫秒");

1.2 LinkedList循环

long startTime = System.currentTimeMillis();LinkedList<Integer> linkedList = new LinkedList<>();for (int i = 0; i < 100000; i++) {    // 循环体}long endTime = System.currentTimeMillis();System.out.println("用for循环LinkedList 10万次花费时间:" + (endTime - startTime) + "毫秒");
startTime = System.currentTimeMillis();LinkedList<Integer> linkedList = new LinkedList<>();for (int element : linkedList) { // 循环体}endTime = System.currentTimeMillis();System.out.println("用foreach循环LinkedList 10万次花费时间:" + (endTime - startTime) + "毫秒");

2. 100万次循环

2.1 ArrayList循环

long startTime = System.currentTimeMillis();ArrayList<Integer> arrayList = new ArrayList<>();for (int i = 0; i < 1000000; i++) {    // 循环体}long endTime = System.currentTimeMillis();System.out.println("用for循环ArrayList 100万次花费时间:" + (endTime - startTime) + "毫秒");
startTime = System.currentTimeMillis();ArrayList<Integer> arrayList = new ArrayList<>();for (int element : arrayList) { // 循环体}endTime = System.currentTimeMillis();System.out.println("用foreach循环ArrayList 100万次花费时间:" + (endTime - startTime) + "毫秒");

2.2 LinkedList循环

long startTime = System.currentTimeMillis();LinkedList<Integer> linkedList = new LinkedList<>();for (int i = 0; i < 1000000; i++) {    // 循环体}long endTime = System.currentTimeMillis();System.out.println("用for循环LinkedList 100万次花费时间:" + (endTime - startTime) + "毫秒");
startTime = System.currentTimeMillis();LinkedList<Integer> linkedList = new LinkedList<>();for (int element : linkedList) { // 循环体}endTime = System.currentTimeMillis();System.out.println("用foreach循环LinkedList 100万次花费时间:" + (endTime - startTime) + "毫秒");

II. 数据结构选择建议

1. ArrayList

初始化: ArrayList采用数组形式保存对象,适合随机访问。初始化时可以通过无参构造函数或指定初始容量,但不代表已经存放了相应数量的元素。循环建议: 在循环ArrayList时,普通for循环比foreach循环花费的时间少一点。适合采用普通for循环,因为它采用下标访问,对于数组结构的数据更为高效。

2. LinkedList

初始化: LinkedList是采用链表结构保存对象,每个节点保存下一个节点的索引。初始化时无法指定初始容量,适合插入和删除操作。循环建议: 切勿使用普通for循环。在循环LinkedList时,普通for循环比foreach循环花费的时间多很多,甚至可能导致系统崩溃。链表结构适合采用foreach循环,避免使用下标访问。

III. 实验结果分析

通过实验结果可以发现,在循环ArrayList时,普通for循环比foreach循环花费的时间要少一点。而在循环LinkedList时,普通for循环比foreach循环花费的时间要多很多,甚至可能导致系统崩溃。

IV. 结论

当循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问更为高效。当循环链表结构的数据时,切勿使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。链表结构适合采用foreach循环,避免使用下标访问。

通过对不同数据结构的循环方式进行对比,能够更好地选择适合场景的循环方式,提高代码效率。

备注

备注: 关注站长获取更多详情。

file
file
正文到此结束
本文目录