Java-for循环那些事
Java for循环里面的 i++ 与 ++i
在for循环里两者的作用是一样的
i++1
2
3
4
5for(int i=0; i<5; i++){
System.out.print(i + ",");
}
>> 0, 1, 2, 3, 4
++i1
2
3
4
5for(int i=0; i<5; ++i){
System.out.print(i + ",");
}
>> 0, 1, 2, 3, 4
工作原理
i++1
2
3
4{
System.out.print(i + ",");
i++;
}
++i1
2
3
4{
System.out.print(i + ",");
++i;
}
区别
在Java里面,i++ 需要开辟新的存储空间用于存储结果,++i 直接在原存储空间中存储结果。故 ++i 在 for 循环里面执行效率要高。 可以作为代码优化的一部分。
foreach 与 for循环的效率
首先测试数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// 测试for循环
int[] A = new int[100000000];
long startTime = System.nanoTime();
int len = A.length;
int res = 0;
for(int i=0; i<len; i++){
res += A[i];
}
long endTime = System.nanoTime();
System.out.println("for循环: "+(endTime- startTime));
// 测试foreach
int[] A = new int[100000000];
long startTime = System.nanoTime();
int len = A.length;
int res = 0;
for(Integer i: A){
res += i;
}
long endTime = System.nanoTime();
System.out.println("foreach循环: "+(endTime- startTime));结果
1
2for循环: 37143324
forecah循环: 75450311可见对于大数组采用for循环效率更高
再测试ArrayList
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22ArrayList<Integer> list = new ArrayList<>(30000000);
for(int i=0; i<30000000; i++){
list.add(i);
}
// 测试for循环
long startTime = System.nanoTime();
int size = list.size();
int res = 0;
for(int i=0; i<size; i++){
res += list.get(i);
}
long endTime = System.nanoTime();
System.out.println("for循环: "+(endTime- startTime));
// 测试foreach
long startTime = System.nanoTime();
int res = 0;
for(Integer i: list){
res += i;
}
long endTime = System.nanoTime();
System.out.println("foreach循环: "+(endTime- startTime));结果
1
2for循环: 39368248
forecah循环: 42177137可见对于ArrayList仍然是采用for循环效率更高!
for循环小技巧
关于数组
循环嵌套采用小套大。原理跟复制几个大文件跟复制一堆小文件耗时一样。
测试
1
2
3
4
5
6
7
8
9
10long startTime = System.nanoTime();
int res = 0;
// 大套小
for(int i=0; i<10000000; i++){
for(int j=0; j<100; j++){
res += i;
}
}
long endTime = System.nanoTime();
System.out.println("大套小: "+(endTime- startTime));1
2
3
4
5
6
7
8// 小套大
for(int i=0; i<100; i++){
for(int j=0; j<10000000; j++){
res += i;
}
}
long endTime = System.nanoTime();
System.out.println("小套大: "+(endTime- startTime));结果
1
2大套小: 57934223
小套大: 4918044- 数组复制时采用System.arraycopy()方法比for循环复制效率高。
System.arraycopy()
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代码解释:
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length : 要copy的数组的长度
关于ArrayList
在循环时,首先把ArrayList长度size记录下来。
测试
1 | ArrayList<Integer> list = new ArrayList<>(30000000); |
结果1
2保存size(): 38973440
没有保存size(): 39486862
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 孙云增的博客!
评论