不耻下问:Java语言i+=1 ++i和i++的区别是什么,哪个速度快,用途广泛呢?
i+=1含义:i=i+1
++i含义:i先自增1,然后用i+1的值去运算
i++含义:先用i去参与运算,后i+1
关于速度和用法,因为第3个和第2个的算法不同,所以用法不同,没有广泛之分
第一和第二,算法规则相同,一般广泛的用途是:第一个。
谢谢
代码示例
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);
以前还真没关心过这三者的效率,猜测应该差不多。那我们就来分别统计一下,每种方法执行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了。