一個Java高級工程師的面試總結,真實的面試流程與面試題與答案

1、面試技巧

一、背熟你的簡歷

緣由:面試的第一個問題,通常都是讓你簡單介紹下你本身,或者介紹一下你最近的項目,而一個面試者,若是連本身的簡歷都沒法熟知,對裏面提到的項目、技術都沒法描述清楚的話,我想沒有哪家公司會接受這樣的,哪怕你是超級人才,你自我表述不行,估計也會爲此頭疼,因此,切記:必定要背好本身的簡歷,不要求你能所有記下,至少要熟記你最近所待過的兩家公司,這兩家公司裏面你作過的項目,你負責的模塊,項目裏面用到的技術以及相對應的技術實現方案(這個尤其重要)。java

因爲文章篇幅限制,不可能將全部面試題以文字形式把大廠面試題展現出來,本篇爲你們精選了一些面試題,若是你須要這份完整版的面試筆記,獲取面試資料只需:點擊這裏領取!!! 暗號:CSDN
在這裏插入圖片描述mysql

二、深刻了解並熟記部分Java基礎知識

緣由:大部分公司不管面試初級仍是高級,不管是筆試仍是面試,都會問到一系列基礎題,這些基礎題大概涵括jvm、字符串、集合、線程等等,若是說每個讓你死記硬揹你確定記不住,那麼就是理解中記憶了,拿jvm來講 ,若是讓你談談你對jvm的理解, 那麼你首先得知道JVM有哪些結構組成,每一個結構用來作什麼的,而後考慮一個Java對象從建立到回收,如何途徑JVM這些結構的。若是你從這些方面來綜合記憶,相信事半功倍,而且你理解的更透徹。程序員

至於若是讓你談集合,舉例List集合下面ArryList、LinkedList、Vector等集合的區別,那麼一樣的方法,你須要理解每個的結構組成是什麼,你才能知道他有什麼做用,這樣你在平時的用法上會更精煉,並且在面試過程當中,也不至於啞口無言。web

三、保持自信心和沉重冷靜的心態

緣由:面試過程當中,自信是少不了的,相信你能夠, 面試的路上能夠本身對本身說一句: I belive I can ! 反正我就是這麼作的,自個人內心暗示吧,其實面對面試官的時候,你自信的狀態也會讓面試官以爲你是個頗有底氣的人,至少從感受上會給你打個高分。面試

另外還有就是保持沉重冷靜,若是是讓你提供技術方案或者說說某個技術原理,不必一緊張一咕嚕的什麼都說,你能夠對面試官說:我先想一想,而後本身組裝記憶中的知識,組裝下語言,有條理的說出來,這樣能更好的表現你的才能,不是嗎? 面試誰都會緊張,我也會緊張,有時候明明記得的知識點忘了,不要緊,大膽的說忘了,或者直接說不知道。 要記住,有部分不知道不要緊,若是全都知道,那你應該是CTO級別了(開個玩笑)。redis

四、儘可能記住面試過程當中你回答不出來或者存在不妥的問題

緣由:面試失敗了不要緊,畢竟每一個公司的要求不同,問的問題和你擅長的方面可能有所出入,可是請記住一點:面試過程當中那些你回答不出來問題,或者你本身感受回答不太準確的問題,本身記下來,若是不會的,你能夠當場問問面試官有沒有好的解答,若是面試官不肯意告訴你(通常是基礎方面面試官就懶得答你),那麼你就本身回家慢慢查資料,若是是某些特定的技術,也能夠本身寫寫案例什麼的,畢竟知識點就那麼多,問題百變,原理不變,面試也是一個學習知識的過程,讓你瞭解大部分公司目前須要或者要求的技術。此次不知道,下次就知道了。算法

五、去面試以前,最好先了解你要去面試公司的狀況

緣由:俗話說,知己知彼,百戰不殆,面試就是一場戰鬥,你須要瞭解你面試公司基本狀況,包括崗位要求,這樣你就能大概知道你須要面試的這家公司的技術要求狀況。 爲什麼讓你去了解這家公司的主營產品和項目呢,就是讓你大概瞭解這家公司的一個技術架構的狀況,包括你可能對他們的一種實現方式提出質疑和疑惑,相信面試官很願意幫你解答這些問題的。這樣你既圖了表現,也學到了知識,何樂而不爲。spring

六、合理安排你的面試時間

緣由:估計不少人都不理解這個,可能大部分的人對於如何安排面試時間比較迷茫,隨意安排。但是這裏有個技巧,若是同時有多個面試機會,你把你最想去的公司放到最末尾去面試,這樣你經歷過了前面的這些公司篩選,若是成功了是個機會,若是沒成功,也是爲最後作鋪墊。sql

不過這裏就須要考慮兩點:一、你須要記住你投簡歷的公司和基本狀況(這說明你不是海投的) 二、若是記不住,那麼能夠先應答一個時間,後續瞭解公司信息以後,經過郵件或者其餘方式與其約定,調整面試時間。並且建議安排一天的面試公司不要超過兩家,最好的是上午一家,下午一家,這樣你能有充足的時間調整狀態。docker

2、面試題基礎總結

一、JVM結構原理、GC工做機制詳情

答:具體參照:JVM結構、GC工做機制詳解,說到GC,記住兩點:一、GC是負責回收全部無任何引用對象的內存空間。 注意:垃圾回收回收的是無任何引用的對象佔據的內存空間而不是對象自己,二、GC回收機制的兩種算法,a、引用計數法 b、可達性分析算法( 這裏的可達性,你們能夠看基礎2 Java對象的什麼週期),至於更詳細的GC算法介紹,你們能夠參考:Java GC機制算法。

二、Java對象的生命週期

答:建立階段 、 應用階段 、不可見階段 、不可達階段 、收集階段 、終結階段、 對象空間從新分配階段等等,具體參照:Java 對象的生命週期。

三、Map或者HashMap的儲存原理

答:HashMap是由數組+鏈表的一個結構組成,具體參照:HashMap的實現原理。

四、當數據表中A、B字段作了組合索引,那麼單獨使用A或單獨使用B會有索引效果嗎?(使用like查詢如何有索引效果)

答:看A、B兩字段作組合索引的時候,誰在前面,誰在後面,若是A在前,那麼單獨使用A會有索引效果,單獨使用B則沒有,反之亦然。同理,使用like模糊查詢時,若是隻是使用前面%,那麼有索引效果,若是使用雙%號匹配,那麼則無索引效果。

五、數據庫存儲日期格式時,如何考慮時區轉換問題?

答:使用TimeStamp , 緣由參照:Java編程中遇到的時區轉換問題。

六、JavaObject類中有哪些方法?

答:Object有哪些方法。

七、HTTP協議,GET和POST 的區別

答:淺談HTTP中GET和POST的區別。

3、線程、設計模式、緩存方面

一、SimpleDataFormat是非線程安全的,如何更好的使用而避免風險呢?

答:關於SimpleDateFormat安全的時間格式化線程安全問題。

二、如何看待設計模式,並簡單說說你對觀察者模式的理解

答:一、設計模式有神馬用二、觀察者模式類圖及實現。

三、集羣環境中,session如何實現共享

答:一、Java集羣之session共享二、session多服務器共享方案,還有一種方案就是使用一個固定的服務器專門保持session,其餘服務器共享。

四、分佈式、集羣環境中,緩存如何刷新,如何保持同步?

答:A、緩存如何刷新?一、定時刷新 二、主動刷新覆蓋,每一個緩存框架都有自帶的刷新機制,或者說緩存失效機制,就拿Redis和 Ehcache舉例, 他們都有自帶的過時機制,另外主動刷新覆蓋時,只需獲取對應的key進行數據的覆蓋便可。

B、緩存如何保持同步? 這個redis有自帶的集羣同步機制,即複製功能,具體參考:基於Redis分佈式緩存實現,Ehcache也有分佈式緩存同步的配置,只須要配置不一樣服務器地址便可,參照:Ehcache分佈式緩存同步。

五、一條sql執行過長的時間,你如何優化,從哪些方面?

答:一、查看sql是否涉及多表的聯表或者子查詢,若是有,看是否能進行業務拆分,相關字段冗餘或者合併成臨時表(業務和算法的優化);

二、涉及鏈表的查詢,是否能進行分表查詢,單表查詢以後的結果進行字段整合;

三、若是以上兩種都不能操做,非要鏈表查詢,那麼考慮對相對應的查詢條件作索引。加快查詢速度;

四、針對數量大的表進行歷史表分離(如交易流水錶);

五、數據庫主從分離,讀寫分離,下降讀寫針對同一表同時的壓力,至於主從同步,MySQL有自帶的binlog實現 主從同步;

六、explain分析sql語句,查看執行計劃,分析索引是否用上,分析掃描行數等等;

七、查看mysql執行日誌,看看是否有其餘方面的問題;

我的理解:從根本上來講,查詢慢是佔用mysql內存比較多,那麼能夠從這方面去酌手考慮。

4、設計方案相關

面試還會問到一些關於設計方案相關的問題,好比:

一、你的接口服務數據被人截包了,你如何防止數據惡意提交?

答:咱們能夠在接口傳輸參數裏面設置一個業務編號,這個編號用來區分是否重複提交。這樣即便數據被抓包了,對方也沒法區分每一個字段你的含義,這時,這個業務編號的做用就來了。

二、假設服務器常常宕機,你從哪些方面去排查問題?

答:這個就留個各位看官補充了。

總而言之該看的仍是得看,還學的仍是得學。再次強調,基礎很重要!面試技巧一樣很重要,仍是那句話:祝願各位看官都能找到心儀的工做吧~~

另外,奉勸你們不要頻繁跳槽,這些知識點能提高當然好,不要盲目跳槽,找工做很累的,並且沒有哪家公司喜歡頻繁跳槽的員工。

5、Java程序員跳槽應該學哪些方面的技術

互聯網產品、大型企業級項目常會用到的:

1.併發處理技術。

具體到Java上一般是涉及java.util.concurrent、併發鎖機制、NIO等方面,固然最近比較火爆的Netty框架也能夠做爲高併發處理的備選方案之一,這須要對Java的線程調度機制有着比較深的理解。不過這些可能會涉及併發控制的對象(好比reentrantlock等)只能存在於一個JVM裏的問題,一旦系統規模大到須要部署多個JVM來處理併發的狀況,則須要採用共享session的技術(好比spring-session),或者儘量將系統後臺設計爲無狀態的服務,這須要對RESTful有着較深的理解。

2.高可用、負載均衡技術。

互聯網產品、企業級應用一般要求一年裏的Downtime控制在很小的範圍內,這須要足夠的高可用和負載均衡架構來支撐,這個通常和Java技術自己沒太大關係,但倒是一名初級程序員向高級程序員甚至是架構師CIO進階的必備技術,所以能夠適當瞭解一下Nginx、HAProxy等對這方面的支持。另外如今最「時髦」的作法是將應用docker化,配合ETCD、kubernetes等工具在容器的層面上實現高可用和負載均衡,固然這須要看實際的需求,最時髦的不見得是最適用的,要考慮構建成本。

3.緩存技術。

緩存應該是大型系統中或高併發條件下提升響應速度的亙古不變的真理(雖然也看到過淘寶搜索商品功能採用的大數據處理技術實現的零緩存的文章,但能達到淘寶的體量和技術水平通常不太可能),這方面的工具太多了,ehcache、memcached、redis……從Java的角度來說,須要瞭解的一是Java對這些工具的鏈接器,二是緩存技術背後的JSR-107標準,能夠參考spring-cache的實現,閱讀一下源碼加深理解。

4.異步處理技術。

這一般也是抵消高併發的處理手段之一,從Java的角度看最簡單的異步處理就是新啓動一個異步線程,這一樣也須要對Java的線程調度有所瞭解,固然也可以使用Spring中的@Async之類的也能夠簡單實現異步線程的處理。若是是很是消耗資源的業務處理,簡單的異步線程是知足不了需求的,這就須要一些消息中間件來作這些異步處理了,消息中間件有不少,activemq、rabbitmq、kafka……須要瞭解的是Java對這些中間件的鏈接器。不過異步處理中最關鍵的是事務保證的問題,這可能須要對事務的兩步提交有所瞭解。