Hello,你好呀,我是
灰小猿!一個超會寫bug的程式猿!
用堅持締造技術、用指尖敲動未來!
和很多小伙伴們一樣,我也是一名奔波在Java道路上的“創造者”,也想靠技術來改變未來,改變世界!因為我們堅信每一次敲動鍵盤都能讓生活變得更智能、世界變得更有趣!
在此專欄《Java核心面試寶典》記錄我們備戰夢想的【day 5】!

每天一個面試技術點,今天來和大家記錄在Java面試中在方法和遞回上的常見面試題及解答,
一、Java中引數的傳遞使用值傳遞還是參考傳遞?
在Java中只有值傳遞而沒有參考傳遞,所以Java中引數的傳遞只能使用值傳遞,
追問:那不同情況下具體是如何傳遞的?
當引數的型別是基本資料型別時,傳遞的是實參的值,因此不能對實參進行修改,
當引數型別是物件時,傳遞的是物件的參考,此時可以對實參參考的物件進行修改,但是不能讓實參參考新的物件,
二、方法的簽名由哪些部分組成?
方法的簽名是由方法名和引數表共同構成的,修飾符和回傳值不屬于方法簽名,方法簽名一般用于方法的多載,方法的多載時方法簽名必須不同,
三、使用方法的多載時,什么情況下會出現編譯錯誤?
出現歧義呼叫的時候會出現編譯錯誤,
如果一個方法呼叫有多個可能的匹配,且編譯器無法判斷哪個方法最匹配,則稱為歧義呼叫,
四、使用遞回演算法的優點和缺點分別有哪些?
優點:使用遞回演算法的優點是代碼簡潔且容易理解,
缺點:時間和空間消耗比較大,每一次函式呼叫都需要在記憶體堆疊中分配空間,對堆疊的操作可能還需要時間,因此時間和空間復雜度較高,
如果子問題之間存在重疊,則在不加記憶化的情況下,可能產生重復計算導致時間復雜度過高,
由于堆疊的空間有限,如果遞回呼叫的次數太多,則可能導致呼叫堆疊溢位,
五、追問:那么可以通過什么方式解決遞回的缺點?
解決遞回的缺點有多種方式,尾遞回是一種做法,另外還可以通過加記憶化的方式避免重復計算,以及改用迭代實作,
六、追問:闡述一下什么是尾遞回?
當遞回呼叫是方法中最后執行的陳述句且它的回傳值不屬于運算式的一部分時,這個遞回呼叫就是尾遞回,
尾遞回的特點是在回傳時直接傳回原始的呼叫者,而不用經過中間的呼叫者,這個特點很重要,因為大多數現代的編譯器會利用該特點自動生成優化的代碼,
使用尾遞回代替普通的遞回,可以在時間和空間方面都帶來顯著的提升,
七、能不能修改斐波那契數列的普通遞回為尾遞回?
斐波那契數列的普通遞回實作:
/**
* 斐波那契數列普通遞回實作
* @param index
* @return
*/
public static long fibonacci(long index) {
if (index <= 1) {
return index;
} else {
return fibonacci(index - 1) + fibonacci(index - 2);
}
}
斐波那契數列的尾遞回實作:
/**
* 斐波那契數列尾遞回實作
* @param index
* @return
*/
public static long fibonacciTailRecursion(long index) {
return fibonacciTailRecursion(index, 0, 1);
}
/**
*遞回體
* @param index 回圈序列
* @param present 當前值
* @param next 下一個值
* @return
*/
public static long fibonacciTailRecursion(long index, int present, int next) {
if (index == 0) {
return present;
} else {
return fibonacciTailRecursion(index - 1, next, present + next);
}
}
每日總結
今天在關于方法的遞回呼叫的核心面試考點中,我們需要掌握方法多載的特征是方法簽名必須不同,了解遞回呼叫的基本思想以及遞回演算法的優化策略,
關于方法和遞回這一塊的面試題就和大家分享這些,如果小伙伴們有遇到其他相關的面試題,歡迎在評論區留言提出,我會把大家提出的總結到文章內,歡迎小伙伴們一起評論區打卡學習!小伙伴們可也在左方加我好友一起探討學習!
我是灰小猿,我們下期見!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291632.html
標籤:java
上一篇:# Day06-Java基礎
