1. 程式人生 > >Java高階工程師面試總結

Java高階工程師面試總結

面試技巧

1、背熟你的簡歷

原因:面試的第一個問題,一般都是讓你簡單介紹下你自己,或者介紹一下你最近的專案,而一個面試者,如果連自己的簡歷都無法熟知,對裡面提到的專案、技術都無法描述清楚的話,我想沒有哪家公司會接受這樣的,哪怕你是超級人才,你自我表述不行,估計也會為此頭疼,所以,切記:一定要背好自己的簡歷,不要求你能全部記下,至少要熟記你最近所待過的兩家公司,這兩家公司裡面你做過的專案,你負責的模組,專案裡面用到的技術以及相對應的技術實現方案(這個尤為重要)。

2、深入瞭解並熟記部分Java基礎知識

原因:大部分公司無論面試初級還是高階,無論是筆試還是面試,都會問到一系列基礎題,這些基礎題大概涵括jvm、字串、集合、執行緒等等,如果說每一個讓你死記硬揹你肯定記不住,那麼就是理解中記憶了,拿jvm來說 ,如果讓你談談你對jvm的理解, 那麼你首先得知道JVM有哪些結構組成,每個結構用來做什麼的,然後考慮一個Java物件從建立到回收,如何途徑JVM這些結構的。如果你從這些方面來綜合記憶,相信事半功倍,並且你理解的更透徹。

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

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

原因:面試過程中,自信是少不了的,相信你可以, 面試的路上可以自己對自己說一句: I belive I can ! 反正我就是這麼做的,自我的心裡暗示吧,其實面對面試官的時候,你自信的狀態也會讓面試官覺得你是個很有底氣的人,至少從感覺上會給你打個高分。

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

4、儘量記住面試過程中你回答不出來或者存在不妥的問題

原因:面試失敗了沒關係,畢竟每個公司的要求不一樣,問的問題和你擅長的方面可能有所出入,但是請記住一點:面試過程中那些你回答不出來問題,或者你自己感覺回答不太準確的問題,自己記下來,如果不會的,你可以當場問問面試官有沒有好的解答,如果面試官不願意告訴你(一般是基礎方面面試官就懶得答你),那麼你就自己回家慢慢查資料,如果是某些特定的技術,也可以自己寫寫案例什麼的,畢竟知識點就那麼多,問題百變,原理不變,面試也是一個學習知識的過程,讓你瞭解大部分公司目前需要或者要求的技術。這次不知道,下次就知道了。

5、去面試之前,最好先了解你要去面試公司的情況

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

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

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

不過這裡就需要考慮兩點:1、你需要記住你投簡歷的公司和基本情況(這說明你不是海投的) 2、如果記不住,那麼可以先應答一個時間,後續瞭解公司資訊之後,通過郵件或者其他方式與其約定,調整面試時間。而且建議安排一天的面試公司不要超過兩家,最好的是上午一家,下午一家,這樣你能有充足的時間調整狀態。

面試題基礎總結

1、JVM結構原理、GC工作機制詳情

答:具體參照:JVM結構、GC工作機制詳解,說到GC,記住兩點:1、GC是負責回收所有無任何引用物件的記憶體空間。 注意:垃圾回收回收的是無任何引用的物件佔據的記憶體空間而不是物件本身,2、GC回收機制的兩種演算法,a、引用計數法 b、可達性分析演算法( 這裡的可達性,大家可以看基礎2 Java物件的什麼週期),至於更詳細的GC演算法介紹,大家可以參考:Java GC機制演算法。

2、Java物件的生命週期

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

3、Map或者HashMap的儲存原理

答:HashMap是由陣列+連結串列的一個結構組成,具體參照:HashMap的實現原理。

4、當資料表中A、B欄位做了組合索引,那麼單獨使用A或單獨使用B會有索引效果嗎?(使用like查詢如何有索引效果)

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

5、資料庫儲存日期格式時,如何考慮時區轉換問題?

答:使用TimeStamp , 原因參照:Java程式設計中遇到的時區轉換問題。

6、JavaObject類中有哪些方法?

答:Object有哪些方法。

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

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

執行緒、設計模式、快取方面

1、SimpleDataFormat是非執行緒安全的,如何更好的使用而避免風險呢?

答:關於SimpleDateFormat安全的時間格式化執行緒安全問題。

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

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

3、叢集環境中,session如何實現共享

答:1、Java叢集之session共享2、session多伺服器共享方案,還有一種方案就是使用一個固定的伺服器專門保持session,其他伺服器共享。

4、分散式、叢集環境中,快取如何重新整理,如何保持同步?

答:A、快取如何重新整理?1、定時重新整理 2、主動重新整理覆蓋,每個快取框架都有自帶的重新整理機制,或者說快取失效機制,就拿Redis和 Ehcache舉例, 他們都有自帶的過期機制,另外主動重新整理覆蓋時,只需獲取對應的key進行資料的覆蓋即可。

B、快取如何保持同步? 這個redis有自帶的叢集同步機制,即複製功能,具體參考:基於Redis分散式快取實現,Ehcache也有分散式快取同步的配置,只需要配置不同伺服器地址即可,參照:Ehcache分散式快取同步。

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

答:1、檢視sql是否涉及多表的聯表或者子查詢,如果有,看是否能進行業務拆分,相關欄位冗餘或者合併成臨時表(業務和演算法的優化);

2、涉及連結串列的查詢,是否能進行分表查詢,單表查詢之後的結果進行欄位整合;

3、如果以上兩種都不能操作,非要連結串列查詢,那麼考慮對相對應的查詢條件做索引。加快查詢速度;

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

5、資料庫主從分離,讀寫分離,降低讀寫針對同一表同時的壓力,至於主從同步,MySQL有自帶的binlog實現 主從同步;

6、explain分析sql語句,檢視執行計劃,分析索引是否用上,分析掃描行數等等;

7、檢視mysql執行日誌,看看是否有其他方面的問題;

個人理解:從根本上來說,查詢慢是佔用mysql記憶體比較多,那麼可以從這方面去酌手考慮。

設計方案相關

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

1、你的介面服務資料被人截包了,你如何防止資料惡意提交?

答:我們可以在介面傳輸引數裡面設定一個業務編號,這個編號用來區分是否重複提交。這樣即使資料被抓包了,對方也無法區分每個欄位你的含義,這時,這個業務編號的作用就來了。

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

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

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

另外,奉勸大家不要頻繁跳槽,這些知識點能提升固然好,不要盲目跳槽,找工作很累的,而且沒有哪家公司喜歡頻繁跳槽的員工。

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對這些中介軟體的聯結器。不過非同步處理中最關鍵的是事務保證的問題,這可能需要對事務的兩步提交有所瞭解。

如果你在學習Java的過程中遇見什麼問題或者想獲取一些學習資源的話歡迎加入小編的Java學習交流QQ群:828545509