一個關於 i++ 和 ++i 的面試題打趴了所有人

程式設計師濟癲發表於2023-09-23

前言

都說大城市現在不好找工作,可小城市卻也不好招人。

我們公司招了挺久都沒招到,主管感到有些心累。

我提了點建議,是不是面試問的太深了,在這種小城市,能幹活就行。

他說自己問的面試題都很淺顯,如果答不上來說明基礎太弱了。

我問了下面試題,然後我沉默了。

起因

起因就是我嘴欠問了下這個面試題:

i++ 和 ++i 有什麼區別,誰的效率更高?並解釋出原因。

沒錯,我竟然答不上來,賊尷尬,心想早知不問了。

主管有些意外,又問了幾個別的同事,沒一個答上來的。

他臉黑了,週四研發部例會的時候,乾脆所有人問了一遍。

好吧,都是工作至少5年以上的Java程式設計師,沒一個人答上來,五花八門的回答,全錯。

然後大家就一致決定(主管決定),每週展開一次學習會,要補基礎,保持團隊學習熱情,提升團隊技術能力。

本來是為了招人,結果自己人被團滅。

正文

我擠出一個晚上不帶娃的時間到處找資料,研究了下這個面試題,在此分享給大家,希望能有幫助。

1、i++ 和 ++i 有什麼區別

首先,先看兩個小例子:

image

image

到這裡先停一下,大家自己思考半分鐘,覺得列印結果是什麼。

然後,我們來看看結果。

image

image

沒錯,第一個列印是 6 和 5,第二個列印是 6 和 6。

這就是他們的區別,解釋下原因:

i++:這是字尾遞增運算子,先將當前值賦給變數,然後再遞增。

++i:這是字首遞增運算子,先遞增變數的值,然後再賦給變數。

2、i++ 和 ++i 誰的效率高

這個問題我其實蒙對了,我說是一樣高的,但是主管問我原因,我沒答上來。

後來告訴我了答案,就是它們被編譯器和JVM最佳化後的位元組碼是相同的,所以效率一樣高。

3、位元組碼指令

然後我就去找了位元組碼指令的用法,將上面的案例以及兩者效率是否一樣進行了驗證。

指令用法很簡單,定位到class檔案所在目錄,使用 javap -verbose 命令執行即可。

1)、從位元組碼看區別

我們將前面那個案例,透過位元組碼指令輸出到txt檔案中。

image

image

在文件編輯器中找到main方法,對這兩個位元組碼內容進行比對,發現確實有如下不同。

可以看到紅框部分,剛好佐證了上面解釋的區別,i++會先使用當前值,然後再遞增;而++i會在遞增之後立即使用新值,透過位元組碼看起來還是挺明顯的。

image

2)、從位元組碼看誰的效率高

我們依然寫個for迴圈的小例子來做驗證。

image

image

將這兩個類編譯後的class透過位元組碼指令輸出到txt中

image

image

接下來我們就可以比對下結果了

image

可以看到,main方法開始,從上到下的位元組碼是完全一樣的,沒任何不同。

所以,i++ 和 ++i 的效率本質是一樣高的。

總結

其實,我相信很多人都見過這個面試題,甚至在筆試題當中也遇到過。

但工作了這麼多年,即使是我,也只是剩下一點印象,也沒有真正去研究一下這個簡單的問題。

希望這篇文章,給大家有所幫助,也能啟發大家如何去研究此類問題。

好了,今天的小知識你學會了嗎?


如果喜歡,請點贊+關注↓↓↓,持續分享乾貨哦!

相關文章