欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

笔记--Java的for循环中i++和++i的区别

程序员文章站 2022-07-15 14:38:17
...

今天在学习HashMap源码的时候,看到人家写的for循环里用的是++i,但是自己对代码的逻辑理解觉得应该是i++,平时写for循环也都是i++,于是就上网查了下for循环里的++i和i++的区别,有人说这两个在for循环里执行是一样的,于是抱着将信将疑的态度自己动手写了个for循环输出了下试试,结果果然是一样的。后来就接着上网查这两种写法的区别,找了几篇文章总结如下:

参考文章:

https://blog.csdn.net/github_37847975/article/details/77369851

https://blog.csdn.net/zy1691/article/details/4849808

 

 首先我们应该都知道++i与i++的区别是: ++i 是先执行 i=i+1 再使用 i 的值,而 i++ 是先使用 i 的值再执行 i=i+1;

然后我们也知道for循环的执行顺序如下:

 

for(A;B;C)
{
   D;
}

 1.进入循环执行A;//只是进入的时候执行.

 2.执行B;//条件为真才执行D,不然就跳出for了.

 3.执行D;

 4.执行C;

 5.再回到第2步开始执行

接着看下面的实例:

   1.for(int i=0; i<10; i++)

 

for(int i = 0; i<10; i++) {
    System.out.println(i);
}

 相当于:

 

 

for(int i=0; i<10;)
{
    System.out.println(i);
    i++;
}

 2.for(int i=0; i<10; ++i)

 

 

for(int i = 0; i<10; ++i) {
    System.out.println(i);
} 

 相当于:

 

 

for(int i=0; i<10;)
{
    System.out.println(i);
    ++i;
}

 在上述的循环体中,i++ 和 ++i 的作用是一样的。

 

然而到这步我们也只是知道了作用效果是一样,但是他们肯定是有一定区别的,得出的结果是:

i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题,也就是说i++语句是需要一个临时变量取存储返回自增前的值,而++i不需要

对于两者的执行效率,接着往下看,网上有两种结果:

一种结论是执行相同的次数,++i的效率要优于i++的效率;

另一种结论是在没有编译器优化的情况下,++i更好。优化过后两者都一样,看起来似乎喜欢怎样写都无所谓了。 但是如果这里的i不是int而是迭代器,那么++在前和在后就会有所不同,使用++i将会有切实的更高的效率。虽然int情况下没多少区别,但为了语法上的统一,最好一律改用++i这种形式。   所以,建议在这种地方一律改用++i的形式。

 

对于以上的结论,总之改用++i的形式就得了。

于是本人也做了个例子:

执行100次的时候:

 

        int c = 0;
        long st = System.nanoTime();
        for (int i = 0; i < 100; i++) {
            c = c + i;
        }
        long et = System.nanoTime();

        System.out.println("c=" + c);
        System.out.println("times:" + (et - st));

结果:
c=4950
times:1614
-------------------------------------------
改成++i:
        int c = 0;
        long st = System.nanoTime();
        for (int i = 0; i < 100; ++i) {
            c = c + i;
        }
        long et = System.nanoTime();

        System.out.println("c=" + c);
        System.out.println("times:" + (et - st));
结果:
c=4950
times:1520

 执行1000次的时候:

 

        int c = 0;
        long st = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            c = c + i;
        }
        long et = System.nanoTime();

        System.out.println("c=" + c);
        System.out.println("times:" + (et - st));
结果:
c=499500
times:12399
----------------------------------------------------
        int c = 0;
        long st = System.nanoTime();
        for (int i = 0; i < 1000; ++i) {
            c = c + i;
        }
        long et = System.nanoTime();

        System.out.println("c=" + c);
        System.out.println("times:" + (et - st));
结果:
c=499500
times:11135

 执行10000次的时候:

 

 

        int c = 0;
        long st = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
            c = c + i;
        }
        long et = System.nanoTime();

        System.out.println("c=" + c);
        System.out.println("times:" + (et - st));
结果:
c=49995000
times:117984
--------------------------------------
        int c = 0;
        long st = System.nanoTime();
        for (int i = 0; i < 10000; ++i) {
            c = c + i;
        }
        long et = System.nanoTime();

        System.out.println("c=" + c);
        System.out.println("times:" + (et - st));

结果:
c=49995000
times:117968 
 

 结论:注意本人测试的时间都是纳秒(因为毫秒结果输入是0),而且比较的结果几乎没有影响,所以在此本人认为这两者的效率我更赞同结论二,在int情况下是没有什么区别的,但还是建议改用++i的形式。