由于公司主要業(yè)務(wù)在香港的原因,一上來就給了兩份資料讓我填,一份用中文填的基本資料,另一份需要用英文回答三個問題,分別是:怎么解決在項目中遇到的問題?你的職業(yè)理想是什么?......
沒有筆試(可能是我讓朋友內(nèi)退的原因吧)
一面(技術(shù)面),兩個面試官
1. 自我介紹
2. 介紹印象深刻的項目,我介紹的是最新在做的項目,用到的技術(shù),自己做的哪些模塊?
回答:講了用到的設(shè)計模式——模版方法,然后講了模式方法的實現(xiàn)
3. 因為最新的項目用到了,問了Spring Boot,Spring的區(qū)別?
回答:去配置化話,然后其他的基本一樣,順便說了一下Spring MVC的原理
4. Spring 的 bean是什么?我說了IOC、DI、Bean之間的關(guān)系
5. Hibernate 和 Mybatis的區(qū)別?
6. 因為項目中用到了webservice,問了創(chuàng)建的方式,怎么訪問?
回答:通過SOAP協(xié)議訪問,創(chuàng)建的方式我忘記了...(我用的是EndPoint發(fā)布的)
7. 因為簡歷中講到了我個人的電商秒殺系統(tǒng)(個人喜好寫的,提升自己的技術(shù)棧)問我怎么實現(xiàn)一個高并發(fā)系統(tǒng)?
回答:
橫向擴展(用nginx實現(xiàn)負載均衡,提高服務(wù)器性能等等)
縱向擴展
1. MQ隊列實現(xiàn)異步下單,減輕服務(wù)器的壓力
2. redis緩存減輕數(shù)據(jù)庫的壓力,redis的算法原理,常用的hash算法、以及一致性hash算法的原理,然后就說具體的做法了,SSO單點登錄的時候用redis中存放用戶信息
3. 緩存秒殺列表界面的方式
4. 前后端分離的開發(fā)模式
其實還有很多個,不過我沒有用到,比如說服務(wù)降級(天貓雙11的時候經(jīng)常會關(guān)閉一下評價或者說不怎么常使用的模塊)、數(shù)據(jù)庫分庫分表
8. 線程的創(chuàng)建方式?怎么實現(xiàn)線程安全?
回答:通過多個線程對static的變量進行++操作,
(1)利用A.Q.S的相關(guān)類比如說AtomicInteger的線程安全的類,順便說了一波實現(xiàn)原理CAS算法(看過相關(guān)
的博客,略懂),Java的內(nèi)存模型等等
(2)利用線程封閉的方式,
(3)利用synchronized、Lock的方式,順便說了一下兩者的區(qū)別,
(4)我還說了一些線程不安全的類,比如說HashMap(大概說了一下源碼實現(xiàn)),可以使用concurrenthashmap (說了分段鎖,其實也是利用CAS算法)...
(5) volatile關(guān)鍵字實現(xiàn)線程安全的用法以及場景,因為volatile保證了線程的可見性、禁止指令重排序,可以用來做來狀態(tài)變量,如果比如說
//線程1
boolean stop = false;
while(!stop){
doSomething();
}
//線程2
stop = true;
因為volatile不具備原子性操作,不適合用來作為原子性操作的場景
9. 只有static的變量是不安全的嗎?還有別的嗎?
回答:堆、方法區(qū)都是線程共享的,棧是線程獨有的,比如說類變量、靜態(tài)變量都是放在堆、方法區(qū)中的,會有線程不安全的情況,棧中的內(nèi)容是線程獨有的,然后再說了下Java的內(nèi)存模型,從主內(nèi)存到線程的棧內(nèi)存
10. 敏捷開發(fā)懂不懂?
回答:舉例了平時的項目(類似敏捷開發(fā)):每周出一次build,然后客戶不滿意,改,繼續(xù)出build;改bug,QA測試有問題,繼續(xù)改.....
11. 個人電商項目的訪問數(shù)量級?有沒有并發(fā)的數(shù)量要求?
回答:我說因為是個人項目沒有統(tǒng)計具體說是什么,會使用Jmeter工具測試優(yōu)化前后的QPS變化量
12. 怎么保證代碼質(zhì)量?
13. 公司項目的數(shù)量級,數(shù)據(jù)庫的量級?
..................
好了,一個小時多的面試結(jié)束了,感覺自己回答的一般,因為webservice的發(fā)布方式忘記了,自己還用過。。
二面 HR面試
- 為什么離開上家公司?
- 為什么來貴公司?
- 怎么提升自己的技術(shù)?
.......
因為HR面的問題都比較常規(guī)不就一一列舉了,HR說基本上技術(shù)面試過就有offer了.....驚喜,讓我回去等offer
總結(jié)
1. 看書
可能是自己準備的比較充分的原因,準備的很多問題都還沒有提問就結(jié)束了,推薦大家一定要多看看《深入理解Java虛擬機》,我個人下載了PDF,反復(fù)看了(順便翻翻)很多遍,比如說初始化一個類的過程一定要知道,類變量、成員變量、常量、方法的存放區(qū)域,java的內(nèi)存模型等等,這次的面試我就說了很多關(guān)于JVM的知識點。還有就是《Java并發(fā)編程實戰(zhàn)》(我買了一直沒翻過,然后找的并發(fā)編程的視頻看),《Head First設(shè)計模式》(我都是上網(wǎng)看的博客),然后自己嘗試畫畫設(shè)計圖,面試前常用的設(shè)計模式都熟悉了一遍,比如說單例模式(每一次寫法,惡漢,懶漢,哪一種實現(xiàn)懶加載,雙重鎖校驗為什么要加volatile等等)、裝飾者模式(IO源碼)等等......
2. 源碼實現(xiàn)
比如說Spring MVC的實現(xiàn)原理,這個很基礎(chǔ)了,源碼肯定要看過、熟悉設(shè)計細想(就是Dispatcherservlet.java這個類了),Spring IOC、AOP的原理,底層原理實現(xiàn),IOC相關(guān)的DI、Bean之前的關(guān)系,AOP相關(guān)的切面(aspect)、連接點(joinpoint)、切入點(pointcut)、通知(advice)、代理模式、JDK動態(tài)代理、CGLib動態(tài)代理
3. 封裝做過的 項目,使用的技術(shù),一般面試官不怎么喜歡聽項目的業(yè)務(wù),主要想看你用的技術(shù),這里推薦兩篇文章,可以看看 面試時這樣介紹自己的項目經(jīng)驗,成功率能達到98.99%、 平時的你VS面試的你
結(jié)尾
寫到這里就寫完了,如果有哪里寫的不好麻煩大家指點指點,因為我經(jīng)常會在頭條看Java面試經(jīng)驗,所以這次也想寫寫文章跟大家交流交流。