乾貨神總結,程序員面試技巧

面試總結
從決定離職開始,前先後後面試了幾家公司,把還能記得住的面試問題總結一下,幫小夥伴們查漏補缺吧,會簡要寫一下我以爲問題的關鍵點,但願小夥伴們能夠一舉拿下offer。python

Java相關

Java GC機制(重要程度:★★★★★)nginx

主要從三個方面回答:GC是針對什麼對象進行回收(可達性分析法),何時開始GC(當新生代滿了會進行Minor GC,升到老年代的對象大於老年代剩餘空間時會進行Major GC),GC作什麼(新生代採用複製算法,老年代採用標記-清除或標記-整理算法),感受回答這些就差很少了,也能夠補充一下能夠調優的參數(-XX:newRatio,-Xms,-Xmx等等)。git

如何線程安全的使用HashMap(重要程度:★★★★★)程序員

做爲Java程序員仍是常常和HashMap打交道的,因此HashMap的一些原理仍是搞搞清除比較好。這個問題感受主要就是問HashMap,HashTable,ConcurrentHashMap,sychronizedMap的原理和區別。github

HashMap是如何解決衝突的(重要程度:★★★★☆)web

其實就是連接法,將索引值相同的元素存放到一個單鏈表裏。但爲了解決在頻繁衝突時HashMap性能下降的問題,Java 8中作了一個小優化,在衝突的元素個數超過設定的值(默認爲8)時,會使用平衡樹來替代鏈表存儲衝突的元素。面試

Java建立對象有哪幾種(重要程度:★★★★☆)算法

這個問題還算好回答,大概有四種—new、工廠模式、反射和克隆,不過這個問題有可能衍生出關於設計模式,反射,深克隆,淺克隆等一系列問題。。。要作好準備~
參考資料:
設計模式Java版
Java反射詳解
深克隆與淺克隆的區別spring

註解(重要程度:★★★☆☆)sql

若是簡歷中有提到過曾自定義過註解,仍是瞭解清楚比較好。主要是瞭解在自定義註解時須要使用的兩個主要的元註解@Retention和@Target。@Retention用來聲明註解的保留策略,有CLASS,RUNTIME,SOURCE三種,分別表示註解保存在類文件,JVM運行時刻和源代碼中。@Target用來聲明註解能夠被添加到哪些類型的元素上,如類型,方法和域等。
參考資料:
Java註解

異常(重要程度:★★★☆☆)

一道筆試題,代碼以下,問返回值是什麼。

int ret = 0;
try{
throw new Exception();
}
catch(Exception e){
ret = 1;
return ret;
}
finally{
ret = 2;
}

 

主要的考點就是catch中的return在finally以後執行 可是會將return的值放到一個地方存起來,因此finally中的ret=2會執行,但返回值是1。
參考資料:
深刻理解Java異常處理機制
Java異常處理

悲觀鎖和樂觀鎖區別,樂觀鎖適用於什麼狀況(重要程度:★★★★☆)

悲觀鎖,就是總以爲有刁民想害朕,每次訪問數據的時候都以爲會有別人修改它,因此每次拿數據時都會上鎖,確保在本身使用的過程當中不會被他人訪問。樂觀鎖就是很單純,心態好,因此每次拿數據的時候都不會上鎖,只是在更新數據的時候去判斷該數據是否被別人修改過。
大多數的關係數據庫寫入操做都是基於悲觀鎖,缺點在於若是持有鎖的客戶端運行的很慢,那麼等待解鎖的客戶端被阻塞的時間就越長。Redis的事務是基於樂觀鎖的機制,不會在執行WATCH命令時對數據進行加鎖,只是會在數據已經被其餘客戶端搶先修改了的狀況下,通知執行WATCH命令的客戶端。樂觀鎖適用於讀多寫少的狀況,由於在寫操做比較頻繁的時候,會不斷地retry,從而下降性能。
參考資料:
關於悲觀鎖和樂觀鎖的區別
樂觀鎖和悲觀鎖

單例模式找錯誤(重要程度:★★★★☆)

錯誤是沒有將構造函數私有化,單例仍是比較簡單的,把它的餓漢式和懶漢式的兩種實現方式看明白了就能夠了。
單例模式

__

Spring相關

關於Spring的問題主要就是圍繞着Ioc和AOP,它們真是Spring的核心啊。

Spring Bean的生命週期(重要程度:★★★★★)

就不寫我那麼low的回答了,直接看參考資料吧。
參考資料:
Spring Bean的生命週期
Top 10 Spring Interview Questions Answers J2EE

Spring中用到的設計模式(重要程度:★★★★★)

工廠模式:IOC容器
代理模式:AOP
策略模式:在spring採起動態代理時,根據代理的類有無實現接口有JDK和CGLIB兩種代理方式,就是採用策略模式實現的
單例模式:默認狀況下spring中的bean只存在一個實例
只知道這四個。。。。
參考資料:
Design Patterns Used in Java Spring Framework

講一講Spring IoC和AOP(重要程度:★★★★★)

IoC的核心是依賴反轉,將建立對象和對象之間的依賴管理交給IoC容器來作,完成對象之間的解耦。
AOP主要是利用代理模式,把許多接口都要用的又和接口自己主要的業務邏輯無關的部分抽出來,寫成一個切面,單獨維護,好比權限驗證。這樣可使接口符合「單一職責原則」,只關注主要的業務邏輯,也提升了代碼的重用性。

AOP的應用場景(重要程度:★★★★☆)

權限,日誌,處理異常,事務等等,我的理解就是把許多接口都要用的又和接口自己主要的業務邏輯無關的部分抽出來,寫成一個切面,單獨維護,好比權限驗證。這樣可使接口符合「單一職責原則」,只關注主要的業務邏輯,也提升了代碼的重用性。

Spring中編碼統一要如何作(重要程度:★★★☆☆)

配置一個攔截器就好了

<filter>  
       <filter-name>CharacterEncodingFilter</filter-name>  
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
       <init-param>  
           <param-name>encoding</param-name>  
           <param-value>UTF-8</param-value>  
       </init-param>  
       <init-param>  
           <param-name>forceEncoding</param-name>  
           <param-value>true</param-value>  
       </init-param>  
   </filter>  
   <filter-mapping>  
       <filter-name>CharacterEncodingFilter</filter-name>  
       <url-pattern>/*</url-pattern>  
   </filter-mapping>

數據庫相關

Mysql索引的內部結構(重要程度:★★★★☆)

B+樹,三層,真實的數據存儲在葉子節點
參考資料:
MySQL索引原理及慢查詢優化

若是一個SQL執行時間比較長怎麼辦(重要程度:★★★★☆)

能夠利用pt-query-digest等工具分析慢查詢日誌,也能夠用explain查看SQL的執行計劃。

若是一張表中有上千萬條數據應該怎麼作分頁(重要程度:★★★☆☆)

確定不能直接limit,offset,主要就是要想辦法避免在數據量大時掃描過多的記錄。

什麼樣的列適合加索引,若是一個列的值只有1和2,那麼它適合加索引麼(重要程度:★★★☆☆)

  • 在where從句,group by從句,order by從句,on從句中出現的列

  • 索引的字段越小越好

  • 在創建聯合索引時,離散度大的列放大聯合索引的前面

只有1和2不適合建索引

Redis相關

Redis提供哪幾種數據結構(重要程度:★★★★★)

一共有5種,字符串,散列,列表,集合,有序集合。
參考資料:
Redis中文官網

Redis支持集羣麼,從哪一個版本開始支持集羣的(重要程度:★★☆☆☆)

支持集羣,從3.0版本開始。固然面試時我也沒記住版本。。。

Redis集羣中,如何將一個對象映射到對應的緩存服務器(重要程度:★★★★☆)

通常就是hash%N,就是用對象的hash值對緩存服務器的個數取餘

接上個問題,緩存集羣中若是新增一臺服務器,怎麼才能不影響大部分緩存數據的命中?(重要程度:★★★★☆)

其實就是一致性Hash算法。之前有看過,惋惜面試的時候腦殼就空了,只記得一個環,果真仍是要實踐啊。
參考資料:
Consistent Hashing
五分鐘理解一致性哈希算法(consistent hashing)

項目中具體是怎樣使用Redis的(重要程度:★★★★☆)

根據實際狀況回答吧。。。。我是主要作權限控制時用到了Redis,將用戶Id和權限Code拼接在一塊兒做爲一個key,放到Redis的集合中,在驗證某一用戶是否有指定權限時,只需驗證集合中是否有用戶Id和權限Code拼接的key便可

算法相關

判斷一個數字是否爲快樂數字(重要程度:★☆☆☆☆)

leetcode第202題
連接

給定一個亂序數組和一個目標數字 找到和爲這個數字的兩個數字 時間複雜度是多少(重要程度:★☆☆☆☆)

leetcode第一題
連接

如何判斷一個鏈表有沒有環(重要程度:★☆☆☆☆)

用快慢指針

刪除字符串中的空格 只留一個(重要程度:★☆☆☆☆)

這個比較簡單。。。。

二叉樹層序遍歷(重要程度:★★☆☆☆)

利用隊列就能夠了

地鐵票價是如何計算的(重要程度:★★☆☆☆)

不知道正確答案,感受是圖的最短路徑算法相關的。

Elasticsearch相關

爲何要用Elasticsearch(重要程度:★★★★☆)

其實對Es的瞭解仍是比較少的,由於沒作多久就去寫坑爹代理商了😖。我的以爲項目中用Es的緣由一是能夠作分詞,二是Es中採用的是倒排索引因此性能比較好,三是Es是個分佈式的搜索服務,對各個節點的配置仍是很簡單方便的

Elasticsearch中的數據來源是什麼,如何作同步(重要程度:★★★★☆)

數據是來自其餘部門的數據庫,會在一開始寫python腳本作全量更新,以後利用RabbitMQ作增量更新,就是數據更改以後,數據提供方將更改的數據插入到指定消息隊列,由對應的消費者索引到Es中

接上個問題,利用消息隊列是會對對方代碼形成侵入的,還有沒有別的方式(重要程度:★★★☆☆)

還能夠讀MySQL的binlog

發散思惟的題

如下題都是沒有正確答案的,不知道是想考思惟,仍是壓力面試,就只寫題目,不寫回答了。你們能夠在面試以前準備下本身的答案以避免慌張。

畫一下心中房樹人的關係(重要程度:★☆☆☆☆)
給你一塊地建房如何規劃(重要程度:★☆☆☆☆)
估計二號線有幾輛車在運行(重要程度:★☆☆☆☆)

其餘

Thrift通訊協議(重要程度:★★★☆☆)

這個問題被問了兩遍,然而如今仍是不知道。。。什麼東西都不能停留在只會用的階段啊~

git相關(重要程度:★★★★★)

一些git相關的問題,好比如何作分支管理(git flow),rebase和merge的區別(merge操做會生成一個新的節點)等等。

如何學習一門新技術(重要程度:★★★☆☆)

google+官網+stackoverflow+github

比較愛逛的網站和愛看的書(重要程度:★★★☆☆)

根據實際狀況回答吧。。。

了不瞭解微服務(重要程度:★★☆☆☆)

簡單瞭解過。。。
參考資料:
基於微服務的軟件架構模式

針對簡歷中的項目問一些問題(重要程度:★★★★★)

就是根據簡歷上的項目問一些東西,好比權限控制是怎麼作的,有沒有碰到過比較難解決的問題之類的,不具體列舉了,只要簡歷上的內容是真實的基本都沒啥問題

爲何要離職(重要程度:★★★★★)

被問了n遍,挺很差回答的一個問題,畢竟不算實習期工做還沒滿一年,這個時候跳槽很容易讓人以爲不安穩。

對公司還有什麼問題(重要程度:★★★★★)

基本每輪面試結束都會問的一個問題,一開始也沒當回事,直到有家公司竟然掛在四面的這個問題上,我也是蠻醉的😂,果真言多必失啊。

在***公司最大的收穫是什麼(重要程度:★★★★★)

對於我來講,以爲最大的收穫就是對企業級的應用有了一個大體的瞭解,企業裏的項目不像學校的課程做業,只要jdbc鏈接數據庫完成功能就能夠了,企業的項目要考慮不少東西,好比說爲了提升可用性,要部署在多臺服務器上,用nginx作負載均衡,還有就是用緩存,異步之類來提升接口性能。而後,也是第一次接觸到SOA,這種面向服務的架構。也瞭解到一個好的應用,除了開發自己,一些自動化發佈系統和監控系統也是必不可少的。

相關文章
相關標籤/搜索