java i 什么时候变_Java中i++与++i的区别(效率分析)
自增運算符是困擾 C 語言與 Java 語言初學者的一大難點,在我最初學習 C 語言時,一直無法理解 i++ 與 ++i 的區別。
幾年的語言學習,特別是對 Java 語言的學習,對一些基本知識點有了更深入的理解,現在我來談談 i++ 與 ++i 的區別與聯系。
注意:這里只講解 i++ 與 ++i ,i- - 與 - -i 可以類比過來
i++ 與 ++i 介紹
i++ 與 ++i 都是自增運算符,i++ 有時被稱作后加運算符,++i 被稱作前加運算符。
顧名思義,后加運算符就是先賦值,在自增長 1,而前加運算符是先自增長 1,然后在賦值。
Java 中的 i++ 與 ++i
通常,i++ 與 ++i 都是出現在循環里面,每循環一次 i 的值都自增長 1 。
/**
*@author kyyee
*
*/
public class Test {
@org.junit.Test
public void test() {
int i;
i = 0;
System.out.println("the result of i++:" + i++ + ",the current value of i:" + i);// 12
i = 0;
System.out.println("the result of ++i:" + ++i + ",the current value of i:" + i);// 14
}
}
這段代碼輸出的結果會是什么呢?
i++ 被稱為后加是有道理的,12 行代碼輸出的結果為:the result of i++:0,the current value of i:1
++i 被稱為前加,14 行代碼輸出的結果為:the result of ++i:1,the current value of i:1
i++ 與 ++i 的理解
借助數學公式來理解 i++ 和 ++i
i++
a = i++;
=> a = i ; i += 1;
++i
a = ++i;
=> i += 1; a = i;
這就是為什么代碼里打印 i++ 為 0,而打印 ++i 為 1 的原因。
結語
在實際應用中,i++ 和 ++i 并沒有區別,最終實現的效果都是自增長1。
具體的,當我們在 for 循環里使用 i++ 與 ++i 時,不同的編譯器會對它們進行優化,這也就是為什么有的時候當一段 C 代碼直接翻譯成 Java 代碼后會出現錯誤的原因。
注意:++i 是左值,而 i++ 不是。
附注:討論 i++ 與 ++i 的效率
/**
*@author kyyee
*
*/
public class Test {
public static void main(String[] args) {
long startTime1 = System.nanoTime();
for (int i = 0; i < 1000000; i++) {
}
System.out.println("i++ time(ms):" + Long.toString((System.nanoTime() - startTime1) / 1000));
System.out.println("i++ time(s):" + Long.toString((System.nanoTime() - startTime1) / 1000 / 1000));
long startTime2 = System.nanoTime();
for (int i = 0; i < 1000000; ++i) {
}
System.out.println("++i time(ms):" + Long.toString((System.nanoTime() - startTime2) / 1000));
System.out.println("i++ time(s):" + Long.toString((System.nanoTime() - startTime2) / 1000 / 1000));
}
}
理論上,經過編譯器優化后 i++ 與 ++i 的效率幾乎一樣,實際測試,++i 效率高于 i++。
從前面的分析過程,i++在計算過程中會多一個緩存變量保存中間值,這直接導致i++速度慢于++i。
#i++++i
時間消耗(s)
5
3
時間消耗(s)
5
4
時間消耗(s)
5
4
時間消耗(s)
3
14
時間消耗(s)
8
1
時間消耗(s)
5
3
去掉不合理的 2 組數據,100 萬次循環,++i 比 i++ 平均少2s,因此編程中推薦使用 ++i。
總結
以上是生活随笔為你收集整理的java i 什么时候变_Java中i++与++i的区别(效率分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java e7 e9格式怎么转_java
- 下一篇: php mysql设计中常问_PHP开发