普通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循环,避免使用下标访问。
通过对不同数据结构的循环方式进行对比,能够更好地选择适合场景的循环方式,提高代码效率。
备注
备注: 关注站长获取更多详情。
- 本文标签: Java 面试题
- 本文链接: https://www.jietongc.com/article/340
- 版权声明: 本文由大熊科技原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权