一文帶你搞懂Java中i++ 和 ++i的區(qū)別
正文
1、i++ 和 ++i 有什么區(qū)別
首先,先看兩個小例子:
到這里先停一下,大家自己思考半分鐘,覺得打印結(jié)果是什么。
然后,我們來看看結(jié)果。
沒錯,第一個打印是 6 和 5,第二個打印是 6 和 6。
這就是他們的區(qū)別,解釋下原因:
i++:這是后綴遞增運算符,先將當(dāng)前值賦給變量,然后再遞增。
++i:這是前綴遞增運算符,先遞增變量的值,然后再賦給變量。
2、i++ 和 ++i 誰的效率高
這個問題我其實蒙對了,我說是一樣高的,但是主管問我原因,我沒答上來。
后來告訴我了答案,就是它們被編譯器和JVM優(yōu)化后的字節(jié)碼是相同的,所以效率一樣高。
3、字節(jié)碼指令
然后我就去找了字節(jié)碼指令的用法,將上面的案例以及兩者效率是否一樣進(jìn)行了驗證。
指令用法很簡單,定位到class文件所在目錄,使用
javap -verbose
命令執(zhí)行即可。
1)、從字節(jié)碼看區(qū)別
我們將前面那個案例,通過字節(jié)碼指令輸出到txt文件中。
在文檔編輯器中找到main方法,對這兩個字節(jié)碼內(nèi)容進(jìn)行比對,發(fā)現(xiàn)確實有如下不同。
可以看到紅框部分,剛好佐證了上面解釋的區(qū)別,i++會先使用當(dāng)前值,然后再遞增;而++i會在遞增之后立即使用新值,通過字節(jié)碼看起來還是挺明顯的。
2)、從字節(jié)碼看誰的效率高
我們依然寫個for循環(huán)的小例子來做驗證。
將這兩個類編譯后的class通過字節(jié)碼指令輸出到txt中
接下來我們就可以比對下結(jié)果了
可以看到,main方法開始,從上到下的字節(jié)碼是完全一樣的,沒任何不同。
所以,i++ 和 ++i 的效率本質(zhì)是一樣高的。
總結(jié)
以上就是一文帶你搞懂Java中i++ 和 ++i的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Java i++ 和 ++i的區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程
這篇文章主要為大家詳細(xì)介紹了win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程,感興趣的小伙伴們可以參考一下2016-06-06Java向上轉(zhuǎn)型和向下轉(zhuǎn)型的區(qū)別說明
這篇文章主要介紹了Java向上轉(zhuǎn)型和向下轉(zhuǎn)型的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Spring Boot 工程的創(chuàng)建和運行(圖文)
這篇文章主要介紹了Spring Boot 工程的創(chuàng)建和運行(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Java位掩碼控制權(quán)限與(&)或(|)非(~)、>的介紹
今天小編就為大家分享一篇關(guān)于Java位掩碼控制權(quán)限與(&)或(|)非(~)、>的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03SpringMVC接收與響應(yīng)json數(shù)據(jù)的幾種方式
這篇文章主要給大家介紹了關(guān)于SpringMVC接收與響應(yīng)json數(shù)據(jù)的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用springmvc具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03