Java乾貨神總結,程式設計師面試技巧

java架構發表於2018-11-14

Java GC機制(重要程度:)

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

如何執行緒安全的使用HashMap(重要程度:)

作為Java程式設計師還是經常和HashMap打交道的,所以HashMap的一些原理還是搞搞清除比較好。這個問題感覺主要就是問HashMap,HashTable,ConcurrentHashMap,sychronizedMap的原理和區別。

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

其實就是連結法,將索引值相同的元素存放到一個單連結串列裡。但為了解決在頻繁衝突時HashMap效能降低的問題,Java 8中做了一個小優化,在衝突的元素個數超過設定的值(預設為8)時,會使用平衡樹來替代連結串列儲存衝突的元素。

Java建立物件有哪幾種(重要程度:)

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

註解(重要程度:)

如果簡歷中有提到過曾自定義過註解,還是瞭解清楚比較好。主要是瞭解在自定義註解時需要使用的兩個主要的元註解@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,這種面向服務的架構。也瞭解到一個好的應用,除了開發本身,一些自動化釋出系統和監控系統也是必不可少的。


相關文章