一文帶你搞懂Java中i++ 和 ++i的區(qū)別
正文
1、i++ 和 ++i 有什么區(qū)別
首先,先看兩個小例子:


到這里先停一下,大家自己思考半分鐘,覺得打印結(jié)果是什么。
然后,我們來看看結(jié)果。


沒錯,第一個打印是 6 和 5,第二個打印是 6 和 6。
這就是他們的區(qū)別,解釋下原因:
i++:這是后綴遞增運算符,先將當前值賦給變量,然后再遞增。
++i:這是前綴遞增運算符,先遞增變量的值,然后再賦給變量。
2、i++ 和 ++i 誰的效率高
這個問題我其實蒙對了,我說是一樣高的,但是主管問我原因,我沒答上來。
后來告訴我了答案,就是它們被編譯器和JVM優(yōu)化后的字節(jié)碼是相同的,所以效率一樣高。
3、字節(jié)碼指令
然后我就去找了字節(jié)碼指令的用法,將上面的案例以及兩者效率是否一樣進行了驗證。
指令用法很簡單,定位到class文件所在目錄,使用
javap -verbose命令執(zhí)行即可。
1)、從字節(jié)碼看區(qū)別
我們將前面那個案例,通過字節(jié)碼指令輸出到txt文件中。


在文檔編輯器中找到main方法,對這兩個字節(jié)碼內(nèi)容進行比對,發(fā)現(xiàn)確實有如下不同。
可以看到紅框部分,剛好佐證了上面解釋的區(qū)別,i++會先使用當前值,然后再遞增;而++i會在遞增之后立即使用新值,通過字節(jié)碼看起來還是挺明顯的。

2)、從字節(jié)碼看誰的效率高
我們依然寫個for循環(huán)的小例子來做驗證。


將這兩個類編譯后的class通過字節(jié)碼指令輸出到txt中


接下來我們就可以比對下結(jié)果了

可以看到,main方法開始,從上到下的字節(jié)碼是完全一樣的,沒任何不同。
所以,i++ 和 ++i 的效率本質(zhì)是一樣高的。
總結(jié)
以上就是一文帶你搞懂Java中i++ 和 ++i的區(qū)別的詳細內(nèi)容,更多關(guān)于Java i++ 和 ++i的區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 集合實現(xiàn)分頁的方法(業(yè)務代碼實現(xiàn)分頁)
在Java開發(fā)中,有些場景比較復雜,受限制,不好在sql查詢層面實現(xiàn)分頁,需要在查詢的list結(jié)果后,將list分頁返回,如何實現(xiàn)呢,帶著這個問題一起通過本文學習吧2025-02-02
ThreadLocal線程在Java框架中的應用及原理深入理解
這篇文章主要介紹了ThreadLocal在Java框架中的應用及原理深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Java?json轉(zhuǎn)換實體類(JavaBean)及實體類(JavaBean)轉(zhuǎn)換json代碼示例
這篇文章主要介紹了兩種常見的JSON與Java實體類相互轉(zhuǎn)換的方法,分別是使用庫Jackson、Gson、Fastjson和在線工具,無論是將JSON轉(zhuǎn)換為Java實體類還是將Java實體類轉(zhuǎn)換為JSON,這些方法都能顯著簡化開發(fā)過程,需要的朋友可以參考下2024-12-12
Java創(chuàng)建非阻塞的HTTP服務器的實現(xiàn)
本文主要介紹了Java創(chuàng)建非阻塞的HTTP服務器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-04-04
Java并發(fā)編程volatile關(guān)鍵字的作用
這篇文章主要介紹了Java并發(fā)編程volatile關(guān)鍵字的作用,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-07-07
Java畢業(yè)設計實戰(zhàn)之醫(yī)院心理咨詢問診系統(tǒng)的實現(xiàn)
這是一個使用了java+Spring+Maven+mybatis+Vue+mysql開發(fā)的醫(yī)院心理咨詢問診系統(tǒng),是一個畢業(yè)設計的實戰(zhàn)練習,具有心理咨詢問診該有的所有功能,感興趣的朋友快來看看吧2022-01-01

