概述
1. for循环
-
基本for循环
for (int i = 0; i < 3; i++) { System.out.println(i); }
-
增强for循环
增强for循环适用于对集合类和数组的循环。List<Integer> list = Arrays.asList(1, 2, 3); for (Integer v : list) { System.out.println(v); }
对于集合类,本质上,它是基于
Collection
的迭代器(iterator
)的简便写法。
通过编译后的class文件可以看出还原后的代码:List<Integer> list = Arrays.asList(1, 2, 3); Iterator var3 = list.iterator(); while(var3.hasNext()) { Integer v = (Integer)var3.next(); System.out.println(v); }
对于数组,编译后,依然是基本的for循环。
//源代码 int[] array = new int[]{1,2,3}; for (int v : array){ System.out.println(v); } //编译后 int[] array = new int[]{1, 2, 3}; int[] var3 = array; int var4 = array.length; for(int var5 = 0; var5 < var4; ++var5) { int v = var3[var5]; System.out.println(v); }
2. 迭代
实现了Collection
接口的所有集合类,都实现了迭代器(iterator
),可以很方便的通过next()
方法进行遍历:
List<Integer> list = Arrays.asList(1, 2, 3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
????思考:Java中遍历集合除了for
,增强for
、Iterator
,还有forEach
,那么这4种遍历方法的效率如何呢?
通过以下代码进行测试:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
int max = 10000000;
for (int i = 0; i < max; i++) {
list.add(i);
}
long start = System.currentTimeMillis();
testFor(list);
long end = System.currentTimeMillis();
System.out.println(end - start);
start = System.currentTimeMillis();
testFor2(list);
end = System.currentTimeMillis();
System.out.println(end - start);
start = System.currentTimeMillis();
testIterator(list);
end = System.currentTimeMillis();
System.out.println(end - start);
start = System.currentTimeMillis();
testForEach(list);
end = System.currentTimeMillis();
System.out.println(end - start);
}
private static void testFor(List<Integer> list) {
int i = 0;
for (int size = list.size(); i < size; i++) {
}
}
private static void testFor2(List<Integer> list) {
for (Integer integer : list) {
}
}
private static void testIterator(List<Integer> list) {
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next();
}
}
private static void testForEach(List<Integer> list) {
list.forEach(v -> {
});
}
测试结果:
数量 | for | 增强for | iterator | foreach |
---|---|---|---|---|
10 | 0ms | 0ms | 0ms | 94ms |
100 | 0ms | 0ms | 0ms | 72ms |
1000 | 1ms | 0ms | 0ms | 88ms |
10000 | 1ms | 1ms | 1ms | 60ms |
100000 | 1ms | 5ms | 2ms | 127ms |
1000000 | 1ms | 9ms | 6ms | 70ms |
10000000 | 1ms | 31ms | 7ms | 80ms |
100000000 | 1ms | 232ms | 17ms | 280ms |
执行效率从高到底依次是:for循环、iterator、增强for循环、foreach。
看一下编译后的class:
private static void testFor(List<Integer> list) {
int i = 0;
for(int size = list.size(); i < size; ++i) {
}
}
private static void testFor2(List<Integer> list) {
Integer var2;
for(Iterator var1 = list.iterator(); var1.hasNext(); var2 = (Integer)var1.next()) {
}
}
private static void testIterator(List<Integer> list) {
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
iterator.next();
}
}
private static void testForEach(List<Integer> list) {
list.forEach((v) -> {
});
}
其中增强for循环也是被替换成了迭代器。之所以iterator
的效率要比增强for高一点,在编译后增强for多了赋值操作:var2 = (Integer)var1.next()
,而测试种使用的iterator
是while
,少了赋值操作。
实际开发中,如果没有极致的性能要求,以上4种遍历方式都可以使用。
最后
以上就是坚定音响为你收集整理的【Java基础系列】循环与迭代1. for循环2. 迭代的全部内容,希望文章能够帮你解决【Java基础系列】循环与迭代1. for循环2. 迭代所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复