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

男娘i 2022-04-06 14:39 434阅读 0赞

今天在学习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循环的执行顺序如下:

  1. for(A;B;C)
  2. {
  3. D;
  4. }

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

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

3.执行D;

4.执行C;

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

接着看下面的实例:

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

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

相当于:

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

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

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

相当于:

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

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

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

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

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

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

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

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

于是本人也做了个例子:

执行100次的时候:

  1. int c = 0;
  2. long st = System.nanoTime();
  3. for (int i = 0; i < 100; i++) {
  4. c = c + i;
  5. }
  6. long et = System.nanoTime();
  7. System.out.println("c=" + c);
  8. System.out.println("times:" + (et - st));
  9. 结果:
  10. c=4950
  11. times:1614
  12. -------------------------------------------
  13. 改成++i
  14. int c = 0;
  15. long st = System.nanoTime();
  16. for (int i = 0; i < 100; ++i) {
  17. c = c + i;
  18. }
  19. long et = System.nanoTime();
  20. System.out.println("c=" + c);
  21. System.out.println("times:" + (et - st));
  22. 结果:
  23. c=4950
  24. times:1520

执行1000次的时候:

  1. int c = 0;
  2. long st = System.nanoTime();
  3. for (int i = 0; i < 1000; i++) {
  4. c = c + i;
  5. }
  6. long et = System.nanoTime();
  7. System.out.println("c=" + c);
  8. System.out.println("times:" + (et - st));
  9. 结果:
  10. c=499500
  11. times:12399
  12. ----------------------------------------------------
  13. int c = 0;
  14. long st = System.nanoTime();
  15. for (int i = 0; i < 1000; ++i) {
  16. c = c + i;
  17. }
  18. long et = System.nanoTime();
  19. System.out.println("c=" + c);
  20. System.out.println("times:" + (et - st));
  21. 结果:
  22. c=499500
  23. times:11135

执行10000次的时候:

  1. int c = 0;
  2. long st = System.nanoTime();
  3. for (int i = 0; i < 10000; i++) {
  4. c = c + i;
  5. }
  6. long et = System.nanoTime();
  7. System.out.println("c=" + c);
  8. System.out.println("times:" + (et - st));
  9. 结果:
  10. c=49995000
  11. times:117984
  12. --------------------------------------
  13. int c = 0;
  14. long st = System.nanoTime();
  15. for (int i = 0; i < 10000; ++i) {
  16. c = c + i;
  17. }
  18. long et = System.nanoTime();
  19. System.out.println("c=" + c);
  20. System.out.println("times:" + (et - st));
  21. 结果:
  22. c=49995000
  23. times:117968

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

发表评论

表情:
评论列表 (有 0 条评论,434人围观)

还没有评论,来说两句吧...

相关阅读