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