Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
738
2022-05-28
Hello,你好呀,我是灰小猿!一個(gè)超會(huì)寫(xiě)bug的程序猿!
用堅(jiān)持締造技術(shù)、用指尖敲動(dòng)未來(lái)!
和很多小伙伴們一樣,我也是一名奔波在Java道路上的“創(chuàng)造者”。也想靠技術(shù)來(lái)改變未來(lái),改變世界!因?yàn)槲覀儓?jiān)信每一次敲動(dòng)鍵盤(pán)都能讓生活變得更智能、世界變得更有趣!
在此專(zhuān)欄《Java核心面試寶典》記錄我們備戰(zhàn)夢(mèng)想的【day 5】!
每天一個(gè)面試技術(shù)點(diǎn),今天來(lái)和大家記錄在Java面試中在方法和遞歸上的常見(jiàn)面試題及解答。
一、Java中參數(shù)的傳遞使用值傳遞還是引用傳遞?
在Java中只有值傳遞而沒(méi)有引用傳遞,所以Java中參數(shù)的傳遞只能使用值傳遞。
追問(wèn):那不同情況下具體是如何傳遞的?
當(dāng)參數(shù)的類(lèi)型是基本數(shù)據(jù)類(lèi)型時(shí),傳遞的是實(shí)參的值,因此不能對(duì)實(shí)參進(jìn)行修改。
當(dāng)參數(shù)類(lèi)型是對(duì)象時(shí),傳遞的是對(duì)象的引用,此時(shí)可以對(duì)實(shí)參引用的對(duì)象進(jìn)行修改,但是不能讓實(shí)參引用新的對(duì)象。
二、方法的簽名由哪些部分組成?
方法的簽名是由方法名和參數(shù)表共同構(gòu)成的,修飾符和返回值不屬于方法簽名,方法簽名一般用于方法的重載,方法的重載時(shí)方法簽名必須不同。
三、使用方法的重載時(shí),什么情況下會(huì)出現(xiàn)編譯錯(cuò)誤?
出現(xiàn)歧義調(diào)用的時(shí)候會(huì)出現(xiàn)編譯錯(cuò)誤,
如果一個(gè)方法調(diào)用有多個(gè)可能的匹配,且編譯器無(wú)法判斷哪個(gè)方法最匹配,則稱(chēng)為歧義調(diào)用。
四、使用遞歸算法的優(yōu)點(diǎn)和缺點(diǎn)分別有哪些?
優(yōu)點(diǎn):使用遞歸算法的優(yōu)點(diǎn)是代碼簡(jiǎn)潔且容易理解,
缺點(diǎn):時(shí)間和空間消耗比較大,每一次函數(shù)調(diào)用都需要在內(nèi)存棧中分配空間,對(duì)棧的操作可能還需要時(shí)間,因此時(shí)間和空間復(fù)雜度較高。
如果子問(wèn)題之間存在重疊,則在不加記憶化的情況下,可能產(chǎn)生重復(fù)計(jì)算導(dǎo)致時(shí)間復(fù)雜度過(guò)高。
由于棧的空間有限,如果遞歸調(diào)用的次數(shù)太多,則可能導(dǎo)致調(diào)用棧溢出。
五、追問(wèn):那么可以通過(guò)什么方式解決遞歸的缺點(diǎn)?
解決遞歸的缺點(diǎn)有多種方式,尾遞歸是一種做法,另外還可以通過(guò)加記憶化的方式避免重復(fù)計(jì)算,以及改用迭代實(shí)現(xiàn)。
六、追問(wèn):闡述一下什么是尾遞歸?
當(dāng)遞歸調(diào)用是方法中最后執(zhí)行的語(yǔ)句且它的返回值不屬于表達(dá)式的一部分時(shí),這個(gè)遞歸調(diào)用就是尾遞歸。
尾遞歸的特點(diǎn)是在返回時(shí)直接傳回原始的調(diào)用者,而不用經(jīng)過(guò)中間的調(diào)用者,這個(gè)特點(diǎn)很重要,因?yàn)榇蠖鄶?shù)現(xiàn)代的編譯器會(huì)利用該特點(diǎn)自動(dòng)生成優(yōu)化的代碼。
使用尾遞歸代替普通的遞歸,可以在時(shí)間和空間方面都帶來(lái)顯著的提升。
七、能不能修改斐波那契數(shù)列的普通遞歸為尾遞歸?
斐波那契數(shù)列的普通遞歸實(shí)現(xiàn):
/** * 斐波那契數(shù)列普通遞歸實(shí)現(xiàn) * @param index * @return */ public static long fibonacci(long index) { if (index <= 1) { return index; } else { return fibonacci(index - 1) + fibonacci(index - 2); } }
斐波那契數(shù)列的尾遞歸實(shí)現(xiàn):
/** * 斐波那契數(shù)列尾遞歸實(shí)現(xiàn) * @param index * @return */ public static long fibonacciTailRecursion(long index) { return fibonacciTailRecursion(index, 0, 1); } /** *遞歸體 * @param index 循環(huán)序列 * @param present 當(dāng)前值 * @param next 下一個(gè)值 * @return */ public static long fibonacciTailRecursion(long index, int present, int next) { if (index == 0) { return present; } else { return fibonacciTailRecursion(index - 1, next, present + next); } }
每日總結(jié)
今天在關(guān)于方法的遞歸調(diào)用的核心面試考點(diǎn)中,我們需要掌握方法重載的特征是方法簽名必須不同,了解遞歸調(diào)用的基本思想以及遞歸算法的優(yōu)化策略。
關(guān)于方法和遞歸這一塊的面試題就和大家分享這些,如果小伙伴們有遇到其他相關(guān)的面試題,歡迎在評(píng)論區(qū)留言提出,我會(huì)把大家提出的總結(jié)到文章內(nèi),歡迎小伙伴們一起評(píng)論區(qū)打卡學(xué)習(xí)!小伙伴們可也在左方加我好友一起探討學(xué)習(xí)!
我是灰小猿,我們下期見(jiàn)!
Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。