
寫在前面
今天分享的是一位8年作業經驗的Java工程師在帝都的面試經驗總結,看看這些互聯網公司都愛問些什么題,希望對大家的面試有指導意義,
從事Java開發也有8年經驗了,11月初自己的開啟面試經歷之旅,前后20天左右,主面互聯網公司,一二線大公司或者是融資中的創業公司都面試過,拿了一些offer,其中包括奇虎360等
首先不同面試官面試風格一定不同,這里是我總結這些天面試Java開發程序中的大多數問題,綜合分類有Java基礎,框架,多執行緒,網路通信,資料庫以及設計模式,演算法等幾個模塊,
一名3年作業經驗的Java程式員應該具備的技能,這可能是Java程式員們比較關心的內容,我這里要說明一下,以下列舉的內容不是都要會的東西----但是如果你掌握得越多,最終能得到的評價、拿到的薪水勢必也越高,
一、Java基礎
- String類為什么是final的,
- HashMap的原始碼,實作原理,底層結構,
- 反射中,Class.forName和classloader的區別
- session和cookie的區別和聯系,session的生命周期,多個服務部署時session管理,
- Java中的佇列都有哪些,有什么區別,
- Java的記憶體模型以及GC演算法
- Java陣列和鏈表兩種結構的操作效率,在哪些情況下(從開頭開始,從結尾開始,從中間開始),哪些操作(插入,查找,洗掉)的效率高
- Java記憶體泄露的問題調查定位:jmap,jstack的使用等等
二、多執行緒
這也是必問的一塊了,因為三年作業經驗,所以基本上不會再問你怎么實作多執行緒了,會問得深入一些比如說Thread和Runnable的區別和聯系、多次start一個執行緒會怎么樣、執行緒有哪些狀態,當然這只是最基本的,出乎意料地,幾次面試幾乎都被同時問到了一個問題,問法不盡相同,總結起來是這么一個意思:
假如有Thread1、Thread2、Thread3、Thread4四條執行緒分別統計C、D、E、F四個盤的大小,所有執行緒都統計完畢交給Thread5執行緒去做匯總,應當如何實作?
聰明的網友們對這個問題是否有答案呢?不難,java.util.concurrent下就有現成的類可以使用,
另外,執行緒池也是比較常問的一塊,常用的執行緒池有幾種?這幾種執行緒池之間有什么區別和聯系?執行緒池的實作原理是怎么樣的?實際一些的,會給你一些具體的場景,讓你回答這種場景該使用什么樣的執行緒池比較合適,
最后,雖然這次面試問得不多,但是多執行緒同步、鎖這塊也是重點,
synchronized和ReentrantLock的區別、synchronized鎖普通方法和鎖靜態方法、死鎖的原理及排查方法等等,關于多執行緒,我在之前有些過文章總結過多執行緒,并發編程的面試問題!

三、IO
IO分為File IO和Socket IO,File IO基本上是不會問的,問也問不出什么來,平時會用就好了,另外記得File IO都是阻塞IO,
Socket IO是比較重要的一塊,要搞懂的是阻塞/非阻塞的區別、同步/異步的區別,借此理解阻塞IO、非阻塞IO、多路復用IO、異步IO這四種IO模型,Socket IO如何和這四種模型相關聯,
這是基本一些的,深入一些的話,就會問NIO的原理、NIO屬于哪種IO模型、NIO的三大組成等等,這有些難,當時我也是研究了很久才搞懂NIO,提一句,NIO并不是嚴格意義上的非阻塞IO而應該屬于多路復用IO,面試回答的時候要注意這個細節,講到NIO會阻塞在Selector的select方法上會增加面試官對你的好感,
如果用過Netty,可能會問一些Netty的東西,畢竟這個框架基本屬于當前最好的NIO框架了(Mina其實也不錯,不過總體來說還是比不上Netty的),大多數互聯網公司也都在用Netty,
四、JDK原始碼
要想拿高工資,JDK原始碼不可不讀,上面的內容可能還和具體場景聯系起來,JDK原始碼就是實打實地看你平時是不是愛鉆研了,程序中被問了不少JDK原始碼的問題,其中最刁鉆的一個問了,String的hashCode()方法是怎么實作的,幸好平時String源代碼看得多,答了個大概,JDK原始碼其實沒什么好總結的,純粹看個人,總結一下比較重要的原始碼:
- List、Map、Set實作類的源代碼
- ReentrantLock、AQS的源代碼
- AtomicInteger的實作原理,主要能說清楚CAS機制并且AtomicInteger是如何利用CAS機制實作的
- 執行緒池的實作原理
- Object類中的方法以及每個方法的作用
這些其實要求蠻高的,去年一整年基本把JDK中重要類的源代碼研究了個遍,真的花費時間、花費精力,當然回頭看,是值得的----不僅僅是為了應付面試,
五、框架
- spring框架中需要參考哪些jar包,以及這些jar包的用途
- srpingMVC的原理
- springMVC注解的意思
- spring中beanFactory和ApplicationContext的聯系和區別
- spring注入的幾種方式
- spring如何實作事物管理的
- springIOC和AOP的原理
- spring中回圈注入的方式

六、資料庫
資料庫十有八九也都會問到,一些基本的像union和union all的區別、left join、幾種索引及其區別就不談了,比較重要的就是資料庫性能的優化,如果對于資料庫的性能優化一竅不通,那么有時間,還是建議你在面試前花一兩天專門把SQL基礎和SQL優化的內容準備一下,
不過資料庫倒是不用擔心,一家公司往往有很多部門,如果你對資料庫不熟悉而基本技術又非常好,九成都是會要你的,估計會先把你放到對資料庫使用不是要求非常高的部門鍛煉一下,

七、資料結構和演算法分析
資料結構和演算法分析,對于一名程式員來說,會比不會好,而且在作業中絕對能派上用場,陣列、鏈表是基礎,堆疊和佇列深入一些但也不難,樹挺重要的,比較重要的樹AVL樹、紅黑樹,可以不了解它們的具體實作,但是要知道什么是二叉查找樹、什么是平衡樹,AVL樹和紅黑樹的區別,記得某次面試,某個面試官和我聊到了資料庫的索引,他問我:
你知道索引使用的是哪種資料結構實作嗎?
答到用的Hash表吧,答錯,他又問,你知道為什么要使用樹嗎?答到因為Hash表可能會出現比較多的沖突,在千萬甚至是上億級別的資料面前,會大大增加查找的時間復雜度,而樹比較穩定,基本保證最多二三十次就能找到想要的資料,對方說不完全對,最后我們還是交流了一下這個問題,我也明白了為什么要使用樹,
八、JVM
出乎意料,Java虛擬機應該是很重要的一塊內容,結果在這幾家公司中被問到的概率幾乎為0,要知道,去年可是花了大量的時間去研究Java虛擬機的,光周志明老師的《深入理解Java虛擬機:JVM高級特性與最佳實踐》,就讀了不下五遍,
言歸正傳,雖然Java虛擬機沒問到,但我覺得還是有必要研究的,就簡單地列一個提綱吧,談談Java虛擬機中比較重要的內容:
- Java虛擬機的記憶體布局
- GC演算法及幾種垃圾收集器
- 類加載機制,也就是雙親委派模型
- Java記憶體模型
- happens-before規則
- volatile關鍵字使用規則
也許面試無用,但在走向大牛的路上,不可不會,這個是面試了幾家公司最后經過整合寫出了這些面試題,面試就決定了你的薪資,一定要好好對待,這些問題可能不會問到,但是程式員技多不壓身,最后收到了百度的offer,薪資還不錯,把這些面試題分享出來希望能幫助那些打算跳槽的人~~

學習共勉
同時金三銀四已經過了,就目前國內的面試模式來講,在面試前積極的準備面試,復習整個 Java 知識體系將變得非常重要,可以很負責任的說一句,復習準備的是否充分,將直接影響你入職的成功率,但很多小伙伴卻苦于沒有合適的資料來回顧整個 Java 知識體系,或者有的小伙伴可能都不知道該從哪里開始復習,我偶然得到一份整理的資料,不論是從整個 Java 知識體系,還是從面試的角度來看,都是一份含技術量很高的資料(PDF版),

更多架構專題及視頻資料展示如下:

資料免費領取方式:一鍵三連后“加我VX小助理”即可免費獲取到!


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/229441.html
標籤:其他
