不耻下问:Java语言i+=1 ++i和i++的区别是什么,哪个速度快,用途广泛呢?

不耻下问:Java语言i+=1 ++i和i++的区别是什么,哪个速度快,用途广泛呢?

i+=1含义:i=i+1
++i含义:i先自增1,然后用i+1的值去运算
i++含义:先用i去参与运算,后i+1
关于速度和用法,因为第3个和第2个的算法不同,所以用法不同,没有广泛之分
第一和第二,算法规则相同,一般广泛的用途是:第一个。
谢谢

1. 两者区别

  • i += 1:就是i = i + 1的简化写法。
  • ++i:先把i的值+1,然后再用i的值去参与运算
  • i++:先将i的值参与运算,然后再把i的值+1

代码示例

        int i = 0;

        // 将i的值+1
        i += 1;
        // 将输出1
        System.out.println("第一次运算i值为:" + i);

        i = 0;
        // 先将i的值+1,然后在与后面的1进行加法运算
        int result = ++i + 1;
        // 输出2
        System.out.println("第二次运算结果为:" + result);
        // 输出1
        System.out.println("第二次运算i值为:" + i);

        i = 0;
        // 先与后面的1进行加法运算,再将i的值+1,然后i自身再加1
        result = i++ + 1;
        // 输出1
        System.out.println("第三次运算结果为:" + result);
        // 输出1
        System.out.println("第三次运算i值为:" + i);

2. 效率问题

以前还真没关心过这三者的效率,猜测应该差不多。那我们就来分别统计一下,每种方法执行1亿次耗时多久

        // i += 1 耗时
        // 记录开始时间
        long startTime1 = System.currentTimeMillis();
        for (long i = 0; i < 100000000; i++) {
            i += 1;
        }
        // 结束时间
        long endTime1 = System.currentTimeMillis();
        // 耗时——毫秒
        System.out.println(endTime1 - startTime1);

        // i++ 耗时
        // 记录开始时间
        long startTime2 = System.currentTimeMillis();
        for (long i = 0; i < 100000000; i++) {
            i++;
        }
        // 结束时间
        long endTime2 = System.currentTimeMillis();
        // 耗时——毫秒
        System.out.println(endTime2 - startTime2);

        // ++i 耗时
        // 记录开始时间
        long startTime3 = System.currentTimeMillis();
        for (long i = 0; i < 100000000; i++) {
            ++i;
        }
        // 结束时间
        long endTime3 = System.currentTimeMillis();
        // 耗时——毫秒
        System.out.println(endTime3 - startTime3);

三次输出38,15,39。

由此可见,三者差不不大(1亿次都才毫秒级的差距),题主不必关心三者的性能问题

public class Test{
    public static void main(String[] args){
        int i = 1;
        i = i++;
        System.out.println(i);
    }
}

用javap命令来看一下底层代码:
图片说明
红色线框内的字节码:
图片说明
当执行iinc时,“increment local variable”,改变了本地变量的值,stack当中“No change”。然后第6步:istore_1,又把栈中的值存到本地变量中,栈中的值木有变,还是1,所以最后执行iload_1时,取本地变量时,取的还是1,所以最终结果是1.

下面我们把i=i++改为i=++i;再来看一下字节码:
图片说明
这个字节码跟上一次的区别就在于,上一次是先执行iload再执行iinc,而这一次是先执行iinc,再执行iload,这样一来,就是自增之后,i为2,然后把2load到栈中,执行赋值语句时,再把栈中的2存到本地变量,这样i的最终结果就是2了。