Java for循环里面的 i++++i

在for循环里两者的作用是一样的

i++

1
2
3
4
5
for(int i=0; i<5; i++){
System.out.print(i + ",");
}

>> 0, 1, 2, 3, 4

++i

1
2
3
4
5
for(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++;
}

++i

1
2
3
4
{
System.out.print(i + ",");
++i;
}

区别

在Java里面,i++ 需要开辟新的存储空间用于存储结果,++i 直接在原存储空间中存储结果。++i 在 for 循环里面执行效率要高。 可以作为代码优化的一部分。

foreach 与 for循环的效率

  1. 首先测试数组

    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
    2
    for循环: 37143324
    forecah循环: 75450311

    可见对于大数组采用for循环效率更高

  2. 再测试ArrayList

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ArrayList<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
    2
    for循环: 39368248
    forecah循环: 42177137

    可见对于ArrayList仍然是采用for循环效率更高!

for循环小技巧

关于数组

  1. 循环嵌套采用小套大。原理跟复制几个大文件跟复制一堆小文件耗时一样。

    测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    long 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
  2. 数组复制时采用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ArrayList<Integer> list = new ArrayList<>(30000000);
for(int i=0; i<30000000; i++){
list.add(i);
}
long startTime = System.nanoTime();
//先把长度保存下来
int len = list.size();
int res = 0;
for(int i=0; i<len; i++){
res += list.get(i);
}
long endTime = System.nanoTime();
System.out.println("保存size(): "+(endTime- startTime));

//没有保存size()
for(int i=0; i<list.size(); i++){
res += list.get(i);
}
long endTime = System.nanoTime();
System.out.println("没有保存size(): "+(endTime- startTime));

结果

1
2
保存size(): 38973440
没有保存size(): 39486862