程序員電話面試題匯總大全
程序員電話面試題匯總大全
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ǔ)代碼和管理代碼庫(kù)版本的軟件,例如SVN、CVS、Git、Perforce和ClearCase。它們?cè)趯?duì)比代碼、審查代碼和從之前的穩(wěn)定版本構(gòu)造時(shí)十分高效。所有的專業(yè)開發(fā)都使用某種版本控制工具,否則你無法有效的管理代碼,尤其是如果有20個(gè)開發(fā)者在同一個(gè)代碼庫(kù)上工作的時(shí)候。版本控制工具在保持代碼庫(kù)一致性和處理代碼沖突上扮演著十分重要的角色。
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)。