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

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,這種面向服務的架構。也瞭解到一個好的應用,除了開發本身,一些自動化發佈系統和監控系統也是必不可少的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章