#分享 (更)【程式學習成果分享】Java工程師面試觀念考題整理(part 2)

2021年11月28日 01:11
前情提要
更新的內容在 B13 - - - - - - - - - - - - - - - 11. 下圖中的程式會輸出什麼內容?
imgur
解答: (1)本題考的是for迴圈的執行流程。首先,for迴圈會執行test('a'),所以test方法會印出a。再來,for迴圈會執行test('b'),所以test方法會印出b。此時,因為「test('b') && i < 2」的運算結果是true,所以for迴圈開始執行其區塊內的程式碼。 (2)i的值遞增1後,for迴圈會執行test('d'),所以test方法會印出d。再來,for迴圈會執行test('c'),所以test方法會印出c。接著,for迴圈再次執行test('b'),test方法印出b。此時,因為「test('b') && i < 2」的運算結果還是true,所以for迴圈會再次執行其區塊內的程式碼。 (3)i的值再次遞增1後,for迴圈再度執行test('d'),test方法印出d。再來,for迴圈再次執行test('c'),test方法印出c。接著,for迴圈再次執行test('b'),test方法印出b。此時,因為「test('b') && i < 2」的運算結果是false,所以迴圈結束。 (4)因此,上圖中的程式會印出"abdcbdcb",如下圖所示。
imgur
12. 試優化下圖中的程式(註:test方法是與main方法位於同一個類別內的靜態方法),使其效率最好。
imgur
解答: (1)由圖片中的程式碼可知,不論程式如何優化,test方法的呼叫次數都是一樣的,所以我們只能盡可能的減少i、j和k的宣告次數、初始化次數、比較次數和遞增次數來使程式的效率最好,如下圖所示,執行次數越多的迴圈,放在越內層,並且把i、j和k的宣告位置移到迴圈外。
imgur
(2)在原本的程式當中,i、j和k的宣告次數、初始化次數、比較次數和遞增次數如下圖所示。
imgur
(3)將程式優化後,i、j和k的宣告次數、初始化次數、比較次數和遞增次數如下圖所示。
imgur
(4)要注意的是,優化程式後,記得將原來傳入test方法的引數移到對應的位置,否則優化後的程式功能會跟原本的程式不一樣。 13. 如果有很多層迴圈,如何在某個迴圈內跳出另一個較外層的迴圈? 解答: (1)break單獨使用時,只能跳出「當前」的迴圈。如果要跳出某個較外層的迴圈,可以為該迴圈定義一個label,然後在break的後面加上那個label的名稱即可。舉例來說,下圖中的程式碼有兩層迴圈,我將最外層的迴圈取名為l,當程式印出第六個*後,便跳出最外層的迴圈。
imgur
(2)除了定義label的方式以外,也可以用例外處理來跳出某個較外層的迴圈。舉例來說,上圖中的程式可以改寫成下圖中的程式,也就是在想要跳出迴圈的地方拋出例外,然後再用catch來捕捉該例外,以終止迴圈。
imgur
14. 下圖中的程式輸出的整數是什麼?
imgur
解答: 「i = i++;」相當於先將i的值存放到另一個變數,接著i的值遞增1,最後將另一個變數的值(i遞增1之前的值)指定給i,如下圖所示。在上圖的程式當中,「i = i++;」執行了50次,每執行完一次,i的值都還是0,所以程式最後會印出0。
imgur
15. 下圖中的程式輸出的整數是什麼?
imgur
解答: 在「x++ == 45」當中,電腦會先運算「x == 45」,然後再將x遞增1,所以「x++ == 45」的運算結果是false,第六行的「x++;」不會執行,x只有遞增一次,程式最後印出45。 16. 下圖中的程式會輸出什麼內容?
imgur
解答: (1)Java的六種數值資料型態的範圍如下圖所示。
imgur
(2)Byte、Short、Integer和Long的MIN_VALUE分別代表byte、short、int和long的最小值;Float和Double的MIN_VALUE分別代表float和double的「正」的最小值,即1.4E-45和4.9E-324。因此,Math.min(Double.MIN_VALUE, 0)的回傳值是0.0(注意:Math的min方法回傳的是double的值)。 17. 「1.0 / 0.0」會得到什麼結果? 解答: (1)Java會用Infinity來表示一個無限大的浮點數,所以「1.0 / 0.0」會得到Infinity。 (2)Java無法表示無限大的整數,所以下圖中的程式執行時會發生例外。
imgur
18. 如何用最有效率的方式計算2乘以8? 解答: 由於CPU直接支援位元運算,所以我們如果用「2 << 3」來計算2乘以8(因為「2 << 3」是把2向左移3個位元,所以相當於把2乘以2的3次方),可以提高運算效率。 19. 假設有兩個整數型態(byte、short、int、long)的變數,要如何在不使用第三個變數的前提下,交換這兩個變數的值? 解答: (1)我們可透過加法和減法來交換兩個整數型態的變數的值(如圖26所示)。 (圖26)
imgur
(2)我們也可透過乘法和除法來交換兩個整數型態的變數的值(如圖27所示)。 (圖27)
imgur
(3)要注意的是,第一種方法和第二種方法並非適用於所有情況。在圖26和圖27當中,如果a和b的型態都小於int,或者b的型態小於a,那麼第二行(「b = a - b;」和「b = a / b;」)會發生編譯錯誤(如圖28和圖29所示,紅線的部分代表編譯錯誤),因為「a - b」和「a / b」的運算結果的型態都大於b。也就是說,a和b的型態必須沒有都小於int,而且b的型態要大於或等於a,圖26和圖27當中的第二行程式碼才不會發生編譯錯誤。另外,第一種方法和第二種方法非常有可能發生溢位的情形,如圖30和圖31所示。 (圖28)
imgur
(圖29)
imgur
(圖30)
imgur
(圖31)
imgur
(4)最佳的方法就是使用xor的運算,如圖32所示,不論a和b是什麼整數型態,程式碼都不會發生編譯錯誤。另外,這種方法比較不容易發生溢位的情形,如圖33所示。 (圖32)
imgur
(圖33)
imgur
20. 說明&和&&的差別。 解答: (1)&和&&都有「且」的意思,如下圖所示。
imgur
(2)&&具有短路的模式,如果&&左邊的運算元是false,那麼它會忽略右邊的運算元,而&沒有短路的模式,所以即使&左邊的運算元是false,它還是會執行右邊的運算。詳細的例子如圖34和圖35所示。 (圖34)
imgur
(圖35)
imgur
(3)&也可用來進行位元運算(如下圖所示),但&&不行。
imgur
愛心WOW
62
留言 14
文章資訊