前言
都說大城市現在不好找工作,可小城市卻也不好招人。
我們公司招了挺久都沒招到,主管感到有些心累。
我提了點建議,是不是面試問的太深了,在這種小城市,能幹活就行。
他說自己問的面試題都很淺顯,如果答不上來說明基礎太弱了。
我問了下面試題,然後我沉默了。
起因
起因就是我嘴欠問了下這個面試題:
i++ 和 ++i 有什麼區別,誰的效率更高?並解釋出原因。
沒錯,我竟然答不上來,賊尷尬,心想早知不問了。
主管有些意外,又問了幾個別的同事,沒一個答上來的。
他臉黑了,週四研發部例會的時候,乾脆所有人問了一遍。
好吧,都是工作至少5年以上的Java程式設計師,沒一個人答上來,五花八門的回答,全錯。
然後大家就一致決定(主管決定),每週展開一次學習會,要補基礎,保持團隊學習熱情,提升團隊技術能力。
本來是為了招人,結果自己人被團滅。
正文
我擠出一個晚上不帶娃的時間到處找資料,研究了下這個面試題,在此分享給大家,希望能有幫助。
1、i++ 和 ++i 有什麼區別
首先,先看兩個小例子:
到這裡先停一下,大家自己思考半分鐘,覺得列印結果是什麼。
然後,我們來看看結果。
沒錯,第一個列印是 6 和 5,第二個列印是 6 和 6。
這就是他們的區別,解釋下原因:
i++:這是字尾遞增運算子,先將當前值賦給變數,然後再遞增。
++i:這是字首遞增運算子,先遞增變數的值,然後再賦給變數。
2、i++ 和 ++i 誰的效率高
這個問題我其實蒙對了,我說是一樣高的,但是主管問我原因,我沒答上來。
後來告訴我了答案,就是它們被編譯器和JVM最佳化後的位元組碼是相同的,所以效率一樣高。
3、位元組碼指令
然後我就去找了位元組碼指令的用法,將上面的案例以及兩者效率是否一樣進行了驗證。
指令用法很簡單,定位到class檔案所在目錄,使用
javap -verbose
命令執行即可。
1)、從位元組碼看區別
我們將前面那個案例,透過位元組碼指令輸出到txt檔案中。
在文件編輯器中找到main方法,對這兩個位元組碼內容進行比對,發現確實有如下不同。
可以看到紅框部分,剛好佐證了上面解釋的區別,i++會先使用當前值,然後再遞增;而++i會在遞增之後立即使用新值,透過位元組碼看起來還是挺明顯的。
2)、從位元組碼看誰的效率高
我們依然寫個for迴圈的小例子來做驗證。
將這兩個類編譯後的class透過位元組碼指令輸出到txt中
接下來我們就可以比對下結果了
可以看到,main方法開始,從上到下的位元組碼是完全一樣的,沒任何不同。
所以,i++ 和 ++i 的效率本質是一樣高的。
總結
其實,我相信很多人都見過這個面試題,甚至在筆試題當中也遇到過。
但工作了這麼多年,即使是我,也只是剩下一點印象,也沒有真正去研究一下這個簡單的問題。
希望這篇文章,給大家有所幫助,也能啟發大家如何去研究此類問題。
好了,今天的小知識你學會了嗎?
如果喜歡,請點贊+關注↓↓↓,持續分享乾貨哦!