1. 程式人生 > >我的JAVA面試經驗(5年左右工作經驗)

我的JAVA面試經驗(5年左右工作經驗)

前言-
致那些迷茫的JAVA面試者(特別是南京的1-4年經驗),致那些奮發的年輕人,致自己。寫這篇博文主要也是對我的成長道路的記錄,面試受挫後的反思,及對自己的勉勵。
本人介紹:3年多經驗的程式設計師,座標南京。
背景:因水平有限,及對部分面試問題記憶及理解有限,可能有些問題並不能表達準確。掌握技術有限,學習主動性一般(雖遇到問題善於思考鑽研,但如果沒有遇到問題比較放縱自己…被自由,輕鬆,安逸迷失心智),以及原公司專案背景因素,基本不需要太多新的技術框架支援,更沒有涉及訊息中介軟體,高併發分散式等等相關較主流技術,技術體系相對較老。綜上導致我對很多新技術並不是太瞭解。
面試經驗背景:基本公司都是按簡歷掌握技術來問(當然也有超綱不按套路出牌的),如果你簡歷掌握技術什麼都不寫,也有可能接到面試邀請,那麼面試官問題可能就比較廣了,對面試者不利。掌握技術我寫了java基礎:多執行緒,io/nio,jvm,集合底層,tcp/ip協議,socket,websocket。spring,springmvc,xml,設計模式,eclipse plugin開發,資料庫,前端(基本沒有什麼人問,面的後端開發,也許熟悉前端也是加分項)瞭解netty、mybatis、redis(實際就是看了一點點).
專案經驗背景:
1.原公司我所在的部門做的是一款大型工具,web專案。專案週期很長很長,至今還在做,具體不細說,技術上就用了上述我寫的部分技術(未涉及redis、netty、mybatis、springmvc),作為專案經歷,該專案競爭力不強。
2.朋友找我做的私活專案,只接觸了一個星期左右,朋友就跟接活人鬧崩了,然後不了了之。但是我還是把專案寫進專案經驗了(投遞的時候寫,自帶的紙質簡歷就把它去掉,以防面試官問到我一臉懵逼…機智如我,當然也有公司不需要你的自帶簡歷,那就沒辦法,他問到的話我就忽悠,坦白)。實際就是個特別小的專案,用到的技術springmvc,mybatis,redis,activemq,阿里雲物件儲存等等。這個專案我只稍微瞭解了一點點springmvc,mybatis,redis最最基本的用法,可以說沒啥用。
面試經歷(具體錄用薪資我就不說明了,只說我對薪資+公司福利滿意度。
面試中專案介紹必定要說的,以及專案中的細節問題,這些不細說了。只說技術問題)
按時間先後排序(時間越遠遺忘的問題可能越多。很多重複的,將就看吧)
1.小公司

名字忘了。時間久遠,只記得有多執行緒,執行緒池拒絕策略,jvm調優,tomcat調優,訊息中介軟體,分散式,叢集,zookeeper,微服務。sql左連線右連線區別,儲存過程。linux。基本全程懵逼,(因為第一次面試,簡歷技術什麼都沒寫,這貨敞開了問)。最後竟然通知我面試通過。
難度-難
公司環境-不滿意
薪資福利-不滿意
工作內容-不滿意(忽悠我剛開始寫邏輯程式碼,以後可能會做微服務,大資料,基本不加班,我是不信的)。
2.軟通動力(華為外包)
stringbuffer和stringbuild區別,stringbuild執行緒不安全體現在哪,你對執行緒安不安全怎麼理解(這個問題發揮空間很大,關鍵詞:全域性變數、JVM執行時資料區、可見性、原子性、鎖、甚至可以說到多核cpu硬體層面(我是不會的)),arraylist和linkedlist區別,spring ioc,aop作用,原理。springmvc執行流程(這種問題最扯淡),hashmap原理(問的很淺,底層結構,答陣列+連結串列/紅黑樹。他就沒問了),hashmap,hashtable,concurrentHashMap(大致基本說下,他就不問了),hashmap遍歷。對大資料有關技術瞭解多少(答:瞭解一點,聽過hadoop)。其它忘了,總體難度不大。寫程式碼:字串分割排序(split+冒泡))。
難度-簡單
薪資福利- 一般
工作內容-不滿意(外包你懂的。有關大資料方面的(這點還可以),更多的是資料清洗)
3.鴻信集團(電信子公司)

一個年紀比較大的面試官,像管理層人員,感覺技術水平有限。基本就問了專案,spring的理解,activemq,沒了。筆試,扯淡的筆試題,寫了一點走人了。公司整體給人的感覺比較自由鬆散,適合養老。感覺技術上沒有發展空間。
面試建議-別去
4.蘇寧
我前後面了4次(因為住的地方就靠著蘇寧,沒事就順便去面試打發時間,4個部門,通過了3個)。寫一起。
蘇寧金服:問的專案業務,公司業務模組(無從下口),為什麼要用redis,相比於如memcached,mongodb有什麼優勢,mybatis,activemq。springmvc有什麼好處,為什麼要用它,springmvc和struts區別(都不會)…用過什麼資料庫,有沒有做過資料庫優化,什麼情況下要用到索引,好處是什麼,哪些欄位適合建立索引,mysql索引底層資料結構瞭解嗎,索引什麼情況下會失效,聯合索引abc只用了a欄位,索引是否會生效。什麼情況下要用到多執行緒,為什麼要用,好處。啟動多個執行緒,如何知道他們都執行完畢了。jquery要想取某個節點中的第幾個元素怎麼寫,具體哪個方法((我看你是閒著蛋疼)答:元素選擇器,find,eq)。 總體回答的很不好,感覺他就盯著我寫的瞭解程度的技術問,有為難我降低我薪資要求的意思。最後通知面試通過(也許是真的缺人,也許是我吹牛比較6,畫了專案流程圖給他)
難度-對於我來說難(其實一般,主要是我實在不太會他問的框架技術)
薪資福利- 一般(面的不太好的地方我是不太好意思去的,感覺進去有種擡不起頭的感覺)
蘇寧易購網站購物車消費者業務線:string為什麼是不可變的,重寫過載,object類有哪些方法,sleep和wait區別,實現執行緒的方式,run,start區別,執行緒有幾種狀態,synchronize實現原理(這個問題可以說的很多,建議大家往深了看,往深了說,以震懾面試官),與lock區別,還知道哪些鎖,說說自旋鎖。執行緒池,執行緒池等待佇列,拒絕策略,死鎖產生原因。為什麼java可以一次編譯,到處執行。事務特性,索引失效,mysql有哪些函式。http和https區別,get和post區別,springbean是單例嗎,spring原始碼看過嗎,其中的單例bean是怎麼實現的。redis有支援哪些資料結構。servlet怎麼取前端引數。(兩個面試官,感覺面試官水平有限,一直在想問什麼問題,越問越沒難度)設計個洗牌演算法。線上購物車需要有個標誌唯一id,有什麼方法實現這個id(uuid,參考jdk中random實現原理,取隨機種子)
難度-一般
薪資福利- 一般
大資料部門:抽象類介面區別,介面中可以定義成員變數嗎,預設是什麼型別的變數(public static final),介面中方法許可權可以是private嗎,介面是否可以寫具體實現(答:jdk8開始可以)重寫過載區別,執行緒的實現方式(我已經感覺到這個部門有多缺人了)。sql交併集,事務隔離級別。能呼叫另一個類的私有方法嗎,怎麼做。如果執行緒池執行shutdown或shutdownNow,執行緒池中執行緒會中斷嗎,會出現什麼異常,catch處理中該寫些什麼。用過哪些concurrent包下的類,說說原子類,cas操作可能會存在什麼問題。jdk中有哪些設計模式的運用,專案中用了哪些設計模式,treemap中compartor用了什麼設計模式,有哪些單例模式的實現方式,springbean是單例嗎。如果想要在某些自己指定的某些方法前後列印日誌怎麼實現(答:自定義註解,問:具體怎麼做,答:spring aop的實現思路…),註解實現原理。
面試難度-一般
薪資福利- 較滿意
蘇寧物流部:蘇寧最難的一次面試經歷,也許是晚上面試,時間充分,安靜,面試官比較好發揮,我全程半懵逼,面試官是中年人,看氣勢最起碼經理級別。
servlet和jsp區別,如果沒有servlet,jsp怎麼跟後端互動(大概是這個意思,沒聽太懂,一臉懵逼)。springmvc怎麼取前端資料,springmvc模式下,如果沒有註解怎麼取前端引數(答:servlet,requset.getParameter。他問,具體在哪怎麼用,也沒聽太懂,懵逼)。搭建springmvc專案步驟。spirngmvc controller中定義全域性hashmap,它是否是執行緒安全的,為什麼。
Io nio區別,nio原理。netty用的多嗎。答,不多。
專案中用哪種方式解析xml的 答:jaxb,dom4j,digester。問:jaxp是什麼。 答:是jaxb,巴拉巴拉… 問:哦哦,挺好用的
servlet生命週期。tomcat在初始化中做了什麼事(答:啟動socket服務端…問:沒了嗎?答:… 很明顯該回答的還有很多,想了解的應該是我對tomcat的理解程度,以及是否看過tomcat原始碼)。是否用過Nginx。過濾器和攔截器的區別。
專案中有用到快取嗎,redis有提供了哪些儲存資料結構,redis持久化。
說說java記憶體模型,新生代老年代演算法,你說的新生代老年代屬於堆還是棧,還知道哪些gc演算法,建立大物件也是在新生代分配嗎,(答:直接晉升進入老年代,問:具體多大物件,答:超過eden區大小,問:你是否確定,頓時虛了,後來回去查閱過,我回答的不對,jvm這裡的看點很多,涉及到優化)。新生代的演算法,說說minor gc,minor gc觸發條件。老年代用了什麼演算法,說說標記整理演算法,full gc是否真正回收了廢棄物件。有哪些gc策略。你覺得你的專案中如果需要jvm調優你會注重哪個分帶的調優,或者說更注重哪種gc調優,為什麼,具體怎麼做(懵逼,隨便吹了下。問:你確定嗎? 頓時又虛了)。
線上系統每天會收到20萬級的資料,一個月會有百萬條,並且還會遞增。你如何設計資料庫(答:分庫分表,建立索引,問:分庫分表對的,還有哪些點,分庫分表按什麼規則分)。如果查詢欄位不是分庫分表的規則欄位,怎麼辦(他說沒事,想到什麼說什麼,也許你的思路會比我們的更好,你說說看)。沉默許久,不會,沒接觸過。(後來查了該問題:分庫分表多維度查詢)問:oracle分頁的sql關鍵字是什麼 答:limit 問:不對吧,那是mysql的 答:啊?好吧 問:也許是limit,我也記不清了,可能你說的是對的,回去我得看看。(面試官還算和藹,其實是rownum)
面試難度- 難
蘇寧結束,總結:蘇寧大部分部門都非常缺程式設計師,招人要求相比於其它大點公司要低一些,都會問的同樣的問題:能否接受蘇寧的加班(部門加班情況不一,按我面試部門瞭解(加班從多到少:金服->物流/購物車->大資料部門),總體加班很多) ,蘇寧的軟體電商工作在外的名聲總體不太好,加班嚴重,福利一般,晉升難,聽說不是太注重員工培養。
5.烽火科技

寫筆試題,筆試題一看就是用心出的(基礎題偏多,也有問答題:線上系統出現故障,怎麼排查。以及一些程式設計題:用jdk自帶包實現抓取指定網頁元素/內容(不會,後來查了,程式碼如下:
),兩個執行緒間隔輸出字元,資料夾中查詢指定型別檔案)。
面試開始:1面。3個技術人員依次提問,jdbc連線步驟,statement和prepareStatement區別,專案中資料庫事務控制你們是怎麼做的。TreeMap,TreeSet,HashSet實現原理(之前只看了hashmap(別人都問hashmap,偏偏他就不問,這公司有套路的)其它回答的不好。這次面試經驗很重要-所有集合實現都得認真看一遍),dom4j怎麼取節點。為什麼重寫equals方法最好也得重寫hashcode。treeMap中元素怎麼排序,如果沒實現comparator介面會怎麼樣。序列化作用。
中途hr跟我聊了聊公司福利,公司制度。
2面,也是3個人,專案經理(從言談中看得出來技術沉澱很不錯)+HR+不知道什麼人(女,基本沒說話)。都是專案經理問。自我介紹,專案介紹,專案細節(問的很細緻)。專案中有用到多執行緒,執行緒池嗎,怎麼用的。說說你對hash的理解。hashSet是怎麼去重的。你知道哪些map,set,說說他們實現原理。紅黑樹,二叉樹。sql優化。linux。socket長連線短連線,連接出現異常你是怎麼處理的。定時器。如果cpu有8個核心,那麼程式啟動多少個執行緒相對合適(懵逼)。最後還是通過了。
難度-稍難(其實還好,是我準備不充分)
薪資福利 - 不滿意
6.擎天科技
最扯淡的一次面試。浪費我時間
面試建議-別去
7.亞信科技(亞信安全)
寫面試題(難度一般,sql,springmvc,程式設計)。Integer快取-128-127物件相不相等問題,其它都是上面提到的問題,不細說了(感覺面試官水平有限),問題基本都完整的回答出來了。跟面試官也談了很久,問了他們現在具體做什麼,用了什麼技術,這家公司所用技術挺老(估計還沒我原公司用到的技術多),貌似也是在做工具,非線上系統。還誇讚了我在原公司的做的專案(所有面試中唯一誇讚的)。
因為這次面試很成功,而且此公司環境和技術方面沒有吸引我的地方,而且面試官還說他們可能就12-13薪 。綜上最終我提了個很高的薪資要求,xx最低。
面試難度-簡單
薪資福利- 一般(沒達到我提的要求)
8.中地控股(付融寶),雲問科技。這兩家問題合併放一起(因為問的很多問題對於我來說算是超綱了,更多的偏向了線上系統大流量情況下的處理方案)。
treeMap元素排序。專案中是否做過jvm優化,sql優化。gc演算法。是否用過webservice。mybatis分頁,redis有關問題。BIO,NIO,AIO區別。高併發情況下怎麼降低伺服器壓力(暫不從增加伺服器和硬體提升層面考慮),方案解決問題:
1.假如servlet處理一個請求需要0.4秒,那麼處理100請求大概需要多久,為什麼。同時處理1000個請求導致伺服器壓力過大崩潰怎麼解決
2.線上系統造成伺服器cpu佔用率過高問題(網上有解決方案)
3.秒殺系統少賣超賣問題怎麼處理(網上有解決方案)
4.有個業務場景,通過第三方工具收集到大概百萬條手機號,儲存到文字中,文字中每行一個號碼。我們的資料庫中會存每個號碼對應的會員等級資訊(也有可能這個號碼在資料庫中不存在,那麼他就是新使用者)。按會員等級給號碼傳送不同內容的資訊,新號碼傳送邀請資訊。設計一個方案,怎麼做效率最高(資料庫資料量很大)。
難度-很難
9.焦點科技
兩位面試官。專案介紹,細節提問。
專案中用到快取了嗎,答:曾經打算用用ehcache,後來發現種種原因(細說)並不需要用到
eclipse外掛開發,它的初始化方法是什麼(答:2年前做的了,實在是忘了…)
以下問題問的很細,我用紅色標註面試官的提問。
ArrayList和LinkedList區別,ArrayList有初始容量嗎,你看的是jdk幾版本 ,容量不夠怎麼辦 ,擴容為多大 ,如果Arraylist當前容量是10,且有9個數據,那麼是新增第10個數據時擴容還是第11個,擴容怎麼實現的,為什麼採用複製陣列的方式而不是往後直接新增資料 。(回答的不好,我回答的是jdk1.8初始化容量10,擴容回答的是2倍,都錯了…ArrayList沒細看,以為很簡單,大概看看就行了,然後看完就忘了,實際上可看的點還是很多的。回去之後研究了下,JDK6-8ArrayList實現都有變化:體現在初始容量不同,1.7之前初始化容量為10,1.7及之後只會初始化空{},新增資料時才會開始給定初始化容量,如果初始化時自定義容量,那麼情況又不一樣,擴容規則
以及其它一些細節,這裡就不細說了)然後我說ArrayList看的不太仔細,面試官問:你比較熟悉哪個集合,答:hashmap。
說說hashmap資料結構(陣列+連結串列,連結串列長度超過8此連結串列轉為紅黑樹(其實不準確,後來又看了1.8原始碼
陣列長度少於MIN_TREEIFY_CAPACITY 是不優先轉紅黑樹的,而是優先進行擴容))。
說說紅黑樹,它是基於什麼資料結構實現的(紅黑樹瞭解不深,只是大致說了下思想-旋轉、平衡、大小比較。(我感覺很難,有空得靜下心來好好研究))。紅黑樹可能會再轉為連結串列嗎(答:長度低於8會轉回連結串列 問:你確定是8而不是6 答:好像是6… (hashmap的看點真的很多,回去看了原始碼真的是6,而且擴容時紅黑樹變化很複雜,暫時看不懂))。說下hashmap put的過程(答:key的hashcode高16位與低16位異或運算得到新的hash,為了讓資料(特別是在當前容量不大的情況下)雜湊更均勻,然後把異或計算出的新hash與此時的hashmap容量-1做&運算,得到插入下標。問:為什麼要做&運算,還有什麼方式。答:二進位制運算速度快,還可以取模。之後如果下標位陣列無資料則直接插入,如果有資料則連結串列往下逐個進行hash比較,如果產生hash碰撞再進行==或者equals比較key是否一樣,一樣則覆蓋原資料,否則新增到連結串列後面。問:發生hash衝突怎麼辦 答:剛剛說了(重複) 問:你確定是新增到連結串列後面嗎 答:確定(我懷疑他jdk8的hashmap沒看全(jdk7是新元素插入至連結串列頭部的)還問了產生hash衝突後為什麼還會比較原來key的hashcode,表示沒聽懂,看了原始碼也沒發現有再次比較的過程,而且之後也重複問rehash後的元素具體去向問題(1.7和1.8元素rehash後元素去向是不同的),還有擴容問題,感覺他對jdk8的hashmap和1.7的有點混淆(還好我沒怎麼看jdk7,不過如果jdk7也看明白了,再說明與1.8的區別之後估計會大大加分吧,有點遺憾))。繼續,當hashmap中資料量超過當前容量*擴容因子(預設0.75)則擴容為原來的2倍,問:還有什麼要求 答:好像沒了 問:當前插入的位置上沒有元素就不擴容吧 答:哦哦。(其實不然,他說的是jdk7的情況,jdk8沒有這個要求。當時要是知道7和8的區別,指出這點,那就是亮點了,再次遺憾))。為什麼是2次冪擴容。(答:我覺得有3點因素。2進位制運算快;hash與當前容量-1做&運算很快且很巧妙地獲得元素下標;擴容後能巧妙地重新分配元素位置)說下擴容的rehash,擴容後的部分節點資料會重新定位,具體規則是hash&原容量,得到無非兩個結果:0和1,如果是0則該元素所在下標位置不動,如果是1則將該元素放置原位置擴容後的對應位置(假如原先容量為16,元素位置在陣列下標14的位置,則擴容後容量為32,該元素移動到陣列下標30的位置(即原索引+原容量位置)。當時沒這點解釋的不夠準確,有瑕疵)。為什麼看hashmap原始碼,你覺得看了後對你有什麼好處(答:比較喜歡探究(其實是近期面試才認真看的…)。知道了計算機位運算速度會比其它數學運算快;學習了它的思想對我思考問題方式有提升(能吹多少儘量吹多少);擴容是一個費效能的事,如果知道集合中大致會存多少元素最好給它一個初始容量),如果你知道里面會存100個左右資料,你會給它多大初始容量 (答:128) 它是執行緒安全的嗎(答:不是,jdk1.8多執行緒情況下可能會造成資料丟失,1.8之前更可能造成死迴圈),執行緒安全的map有什麼(答:hashtable,concurrentHashMap,前者已經被後者替代了,效率更高),說說concurrentHashMap,預設容量多少(答:16。只是瞭解,太複雜了,沒細看,只知道jdk1.8之前採用分段鎖方式處理,1.8之後採用cas樂觀鎖的方式來操作)。其它集合類瞭解嗎(hashSet,treeSet,treeMap,都解釋的相對明白,篇幅過長,不細說了),它們是否允許插入空值(treeSet,treeMap不可以)使用treeMap有什麼需要注意的 (其中的元素要實現comparator介面)
有關synchronize的問題(忘了怎麼問的了,只記得回答的挺多(作用,原理及jdk6之後的優化(鎖升級:偏向鎖->輕量級鎖->重量級鎖)))。Lock介面有哪些實現類,說說讀寫鎖。
java記憶體模型,新生代老年代演算法,簡述新生代老年代gc過程,演算法(複製回收(這裡沒說太明白,有點模糊),標記清除,標記整理(也說的不漂亮))。為什麼新生代和老年代採用gc演算法不同。jvm調優。
執行緒池有哪些引數,各代表什麼意思。執行緒池中提供哪些佇列種類。假如執行緒池核心池5,總池大小10,有界佇列長度10,現在有13個執行緒要用執行緒池執行,說下核心池和佇列中的執行緒情況。jdk中提供了哪幾種執行緒池的實現。專案中用到執行緒池嗎。
JDK中有哪些設計模式的體現,io中用了什麼設計模式,說說觀察者模式,專案中用了哪些設計模式。jdk8有哪些新增功能(答:那個箭頭的那個叫什麼來著 面試官:(笑)lambda表示式 答:對,可以讓一些操作更直白簡單,也有效率上的提高 問:說說它的閉包體現在哪 答:(隨便說說,也不知道對不對) 還有哪些其它功能 答:還可以引數傳入方法 問:它有什麼好處 (隨便說了點,也不知道對不對))。
redis有哪些資料結構。spring bean的生命週期,spring的BeanFactory和FactoryBean有什麼區別。
之後問工作中,程式碼上的一些注意細節,總共面試時間將近2小時,最長時間一次面試。給我的感覺面試氛圍很好,有位面試官全程都是笑著的,另一位稍微嚴肅,都挺好。
面試難度- 稍難
薪資福利-薪資稍低,福利很好

總結:大型網際網路通訊公司相對於外包、小型公司更注重面試者對基礎的掌握程度。
面試及學習建議:(基礎->spring/springmvc/mybatis/資料庫、快取->訊息中介軟體(activemq、kafka…)->(後面的僅代表個人看法,未知領域…)springboot、微服務、docker/分散式、zookeeper、rpc/大資料相關)
工作一到五年的Java工程師朋友們可以加入加入Java架構開發:760940986
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
**原始碼分析**

**分散式架構專題**
**微服務專題**
**效能調優**
**團隊協作**
工作一到五年的Java工程師朋友們可以加入加入Java架構開發:760940986
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!