程序員電話面試題匯總大全
程序員電話面試題匯總大全
1. 從哈希表,二叉樹和鏈表中取元素需要多少時(shí)間?如果你有數(shù)百萬記錄呢?
哈希表需要O(1)時(shí)間,二叉樹需要O(logN) (N是樹中節(jié)點(diǎn)數(shù)),鏈表需要O(N) (N是鏈表中節(jié)點(diǎn)數(shù))。如果數(shù)據(jù)結(jié)構(gòu)工作正常(比如哈希表沒有或只有相對(duì)少量沖突,二叉樹是平衡的),數(shù)百萬記錄并不影響效率。如果工作不正常,那么效率會(huì)隨著記錄數(shù)上升而下降。
2. 覆蓋(Overriding)和重載(Overloading)的區(qū)別是什么? (detailed answer)
覆蓋在運(yùn)行時(shí)決定,重載是在編譯時(shí)決定。并且覆蓋和重載的機(jī)制不同,例如在Java中,重載方法的簽名必須不同于原先方法的,但對(duì)于覆蓋簽名必須相同。
3. fork一個(gè)進(jìn)程和生成一個(gè)線程有什么區(qū)別?
當(dāng)你fork一個(gè)進(jìn)程時(shí),新的進(jìn)程將執(zhí)行和父進(jìn)程相同的代碼,只是在不同的內(nèi)存空間中。但當(dāng)你在已有進(jìn)程中生成一個(gè)線程時(shí),它會(huì)生成一個(gè)新的代碼執(zhí)行路線,但共享同一個(gè)內(nèi)存空間。
4. 什么是臨界區(qū)? (answer)
臨界區(qū)是一段代碼,十分重要,在多線程中同一時(shí)間只能被一個(gè)線程執(zhí)行??梢杂眯盘?hào)量或互斥量來保護(hù)臨界區(qū)。在Java中你可以用synchronized關(guān)鍵字或ReentrantLock來保護(hù)臨界區(qū)。
5. 值類型和引用類型有什么區(qū)別? (answer)
值類型是更加優(yōu)化的類型,總是不可變的(immutable),例如Java原始的int、long、double和float。引用類型指向一個(gè)對(duì)象,可能是可變的,也可能是不變的。你也可以說值類型指向一個(gè)值,引用類型指向一個(gè)對(duì)象。
6. 什么是在進(jìn)程中的堆和棧?(detailed answer)
在同一個(gè)進(jìn)程中,有兩塊不同的內(nèi)存區(qū)域。以Java來說,棧用來存儲(chǔ)原始值和指向?qū)ο蟮囊妙愋?,但?duì)象本身總是在堆中被創(chuàng)建。堆和棧的一個(gè)重要區(qū)別是,堆內(nèi)存被所有線程共享,但每個(gè)線程有自己的棧。
7. 什么是版本控制?(answer)
版本控制是用來存儲(chǔ)代碼和管理代碼庫版本的軟件,例如SVN、CVS、Git、Perforce和ClearCase。它們?cè)趯?duì)比代碼、審查代碼和從之前的穩(wěn)定版本構(gòu)造時(shí)十分高效。所有的專業(yè)開發(fā)都使用某種版本控制工具,否則你無法有效的管理代碼,尤其是如果有20個(gè)開發(fā)者在同一個(gè)代碼庫上工作的時(shí)候。版本控制工具在保持代碼庫一致性和處理代碼沖突上扮演著十分重要的角色。
8. 什么是強(qiáng)類型程序設(shè)計(jì)語言?(answer)
在強(qiáng)類型語言中,編譯器確保類型的正確性,例如你無法在String類型中存放數(shù)字,反之亦然。Java是強(qiáng)類型語言,因此存在各種數(shù)據(jù)類型(如int、float、String、char、boolean等)。你只能將兼容的值存入相應(yīng)的類型中。與此相反,弱類型語言不要求在編譯時(shí)進(jìn)行類型檢查,它們根據(jù)上下文處理值。Python和Perl是兩個(gè)常見的弱類型程序設(shè)計(jì)語言的例子,你可以將數(shù)字組成的字符串保存在數(shù)字類型中。
9. 可否描述一下有效(valid)的XML和格式正確(well-formed)的XML的區(qū)別?
格式正確的XML有根元素,所有標(biāo)簽都是正確關(guān)閉的,屬性是正確定義的,它們的值正確地加上了引號(hào)。另一方面,有效的XML可以根據(jù)一個(gè)XSD文件或模式(schema)進(jìn)行驗(yàn)證。所以一個(gè)XML可能是格式正確但不有效的(因?yàn)榘槐荒J皆试S的標(biāo)簽)。
10. DOM和SAX語法分析器有什么區(qū)別?(detailed answer)
DOM語法分析器是駐留內(nèi)存的,將整個(gè)XML文件裝載到內(nèi)存中,并創(chuàng)建一個(gè)DOM樹進(jìn)行語法分析。SAX語法分析器是一個(gè)基于事件的語法分析器,所以它根據(jù)收到的事件(如開始標(biāo)簽、結(jié)束標(biāo)簽、屬性開始和屬性結(jié)束)來對(duì)XML文檔進(jìn)行語法分析。根據(jù)他們的分析方法,DOM語法分析器并不適用于大的XML文件,因?yàn)樗鼤?huì)占用大量的內(nèi)存空間,你的進(jìn)程可能會(huì)耗盡內(nèi)存。應(yīng)該用SAX分析大的文件。對(duì)于小的文件,DOM往往比SAX快很多。
11. 線程和進(jìn)程的關(guān)系是什么?(detailed answer)
一個(gè)進(jìn)程可以有多個(gè)線程,但一個(gè)線程總是屬于唯一的進(jìn)程。兩個(gè)進(jìn)程不能共享內(nèi)存空間,除非它們有意通過共享內(nèi)存進(jìn)行進(jìn)程間通信。但是同一進(jìn)程的兩個(gè)線程總是共享相同的內(nèi)存。
12. 不可變(immutable)類是什么意思?(detailed answer)
一個(gè)類,如果在創(chuàng)建之后它的狀態(tài)就不能被改變,那么他就是不可變的。例如Java中的String。一旦你創(chuàng)建了一個(gè)String,例如“Java”,你就不能再改變它的內(nèi)容。任何對(duì)這個(gè)字符串的改變(例如轉(zhuǎn)換到大寫、與另一個(gè)String連接)將創(chuàng)建一個(gè)新的對(duì)象。不可變的對(duì)象在并行程序設(shè)計(jì)中很有用,因?yàn)樗鼈兛梢栽谶M(jìn)程間被共享,不需要擔(dān)心同步。事實(shí)上,整個(gè)函數(shù)式程序設(shè)計(jì)的模型都是基于不可變對(duì)象構(gòu)建的。
13. 你為何要?jiǎng)?chuàng)建模擬(mock)對(duì)象? (answer)
模擬對(duì)象在測(cè)試軟件中一個(gè)獨(dú)立的單元時(shí)很有用,事實(shí)上,存根(stub)和模擬都是創(chuàng)建自動(dòng)化單元測(cè)試的有力工具。假設(shè)你在寫一個(gè)顯示貨幣兌換率的程序,但沒有一個(gè)可以連通的URL,現(xiàn)在如果想測(cè)試你的代碼,可以用模擬對(duì)象。在Java的世界中,有很多框架可以為你生成強(qiáng)大的模擬對(duì)象,例如Mockito和PowerMock。
14. 什么是SQL注入?
SQL注入是一種安全漏洞,它使得入侵者可以從系統(tǒng)中竊取數(shù)據(jù)。任何從用戶那里得到輸入并不加驗(yàn)證地創(chuàng)建SQL查詢的系統(tǒng)都可能被SQL注入攻擊。在這樣的系統(tǒng)中,入侵者可以輸入SQL代碼,而不是數(shù)據(jù),來獲取額外的數(shù)據(jù)。有很多用敏感信息(如用戶id、密碼和個(gè)人信息)被人利用這種漏洞獲取的實(shí)例。 在Java中,你可以用Prepared語句來避免SQL注入。
15. 在SQL中,內(nèi)連接(inner join)和左連接(left join)有什么區(qū)別?(answer)
在SQL中,主要有兩種連接類型,內(nèi)連接和外連接。外連接包括右外連接和左外連接。內(nèi)連接和左連接的主要區(qū)別是,內(nèi)連接中兩個(gè)表都匹配的記錄才被選中,左連接中兩個(gè)表都匹配的記錄被選中,外加左表的所有記錄都被選中。要留意包含“所有”的查詢,它們往往要求左連接,例如寫一個(gè)SQL查詢來找所有的部門和它們的雇員人數(shù)。如果你用內(nèi)連接處理這個(gè)查詢,你會(huì)漏掉沒有人工作的空部門。
16. MVC中的V代表什么,意味著什么?(answe)
在MVC模式中,V是視圖(View)。視圖是用戶看到的東西,比如網(wǎng)頁。這是一個(gè)非常重要的web應(yīng)用開發(fā)設(shè)計(jì)模式,它基于關(guān)注點(diǎn)分離原則,目的是不同模塊可以獨(dú)立修改,不影響其他模塊。在Java的世界中,有很多提供MVC模式的開源框架,例如Struts 2和Spring MVC。順便說一下,M代表模型(Model),C代表控制器(Controller)。模型是實(shí)際的業(yè)務(wù)對(duì)象,例如用戶、雇員、訂單,控制器用來將請(qǐng)求分發(fā)給正確的處理單元。
17. 類和對(duì)象的區(qū)別是什么? (detailed answer)
類是用來創(chuàng)建對(duì)象的設(shè)計(jì)圖。一個(gè)類包括代碼和行為,一個(gè)對(duì)象包括狀態(tài)和行為。要?jiǎng)?chuàng)建一個(gè)對(duì)象,你必須創(chuàng)建一個(gè)表達(dá)對(duì)象結(jié)構(gòu)的類。類還被用來在內(nèi)存中映射對(duì)象,在Java中,JVM替你完成這項(xiàng)工作。
18. 什么是疏耦合(loose-coupling)?
疏耦合是一種值得追求的軟件特性,它使得對(duì)軟件一個(gè)部分的修改不會(huì)影響到其他的部分。例如,在一個(gè)疏耦合的軟件中,對(duì)UI布局的改變不應(yīng)該影響后端的類結(jié)構(gòu)。