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