申明:這篇文章是我自己個人的經驗之談,非我所屬公司的官方資料,不代表我所屬公司的任何觀點。本建議只適合於工作時間不超過5年的,超過5年的業界可能的要求又不太一樣了。
最近在boss上發了一些內推的崗位,和我聊的人還是很多的。但是我發現不論是個人能力還是簡歷都存在很多的問題,為了方便大家也方便自己,現在對java後臺求職需要注意的一些問題進行了總結,歡迎大家提出一些寶貴的意見。
1.專業技能
專業技能是每個公司的必考項,它是你工作最基本的東西。我列舉了一下經常被問到的一些問題。
1.1 Java基礎知識
- String 是否能夠被繼承,它是Immutable的;字串常量池;StringBuffer 和StringBuilder 的區別,什麼時候可以選StringBuilder,同樣的可以問List和Vector的區別。
- 集合相關,HashMap和TreeMap的區別,底層資料結構是什麼;LinkList和ArrayList的區別,下面這段程式碼list是LinkList和ArrayList有什麼區別。
for (int i = 0; i < list.size(); ++i) {
String s = list.get(i);
}
複製程式碼
- 多執行緒相關:AbstractQueuedSynchronizer,lock,Condition,CyclicBarrier,CountDownLatch,Future,ConcurrentHashMap這些內容一定要去了解,肯定會問到;Object.wait(),Object.notify()這些的使用(結合看一下Conditon的使用),它和Thread.Sleep的區別(鎖是否被釋放);valotile和synchronize關鍵字有什麼用,synchronize和juc包裡面的lock對比;物件鎖和類鎖(static方法);
- ClassLoader相關的內容,熟悉一下Bootstrap Class Loader,Extension Class Loader和System Class Loader。網上相關的文章還是很多的,可以看一下;熱部署的簡單思路等;
- 範型和反射:因為spring這種框架大量的使用了範型和反射,所以這個問題一定會問到。
- JVM和GC,JVM的記憶體分佈,引用計數有什麼問題,標記清除演算法大概的思路;目前GC常用的一些演算法比較,有沒有對JVM進行過調優;jmap、jstat、jinfo等常用命令的使用,mat工具的使用。
- NIO 相關:你只要知道IO多路複用,select,poll和epoll這些一般問題不大,如果你專案裡面有用到相關的一些庫(比如netty),那可能會問的比較深入一些。
1.2 Spring Boot
Spring Boot是目前比較流行的Java Web框架,所以一般都會問相關的問題,只是深淺不同。spring的問題會有很多,我也說不上來具體很問哪些(主要是我也不太熟)
- IOC的概念,為什麼要IOC。
- AOP,主要的實現方式:JDK動態代理(需要實現介面)和cglib,應用:transactional註解,當然也可以根據實際使用的情況展開回答。
- 原始碼閱讀:需要平時積累的。
1.3 mysql
其實應該是RDBMS的,但目前用的比較多的就是mysql了,所以就以mysql為例,進行說明。mysql推薦大家一個部落格,水平還是比較高的。
- ACID原則,這個概念需要好好的理解,結合事務一起。
- 事務和鎖:事務的隔離機制;非阻塞讀,官方文件值得好好的閱讀。
- 索引相關:InnoDb聚簇索引和非聚簇索引,關於索引優化的可以看一下一本叫High Performance Mysql的書,講的還是蠻詳細的;explain的使用手冊。
- 對分庫分表的理解
1.4 nosql
隨著網際網路的迅猛發展,傳統的RDBMS無法滿足業務的需要。常見的一些nosql資料庫包括:redis,memcache,mongodb,hbase等。一般會根據候選人對這些資料庫的熟悉情況來進行提問。常見問題如下:
- redis有哪些資料結構,你用過哪些,為什麼要用這些資料結構,你的思考是什麼。
- redis實現相關,比如它是event driven的,使用了io多路複用。redis可以執行lua指令碼來做一些複雜的原子操作,但是不要把一些耗時的操作放在lua裡面,否則block其他的命令就麻煩了。
- 架構:一般來說nosql會和分散式的一些理論結合起來問,所以經常會問使用的這些資料庫的架構是什麼,為什麼要這樣設計,畫一下簡單的架構圖。
- 這些資料庫對ACID的支援怎麼樣,你是怎麼看待這些問題的。
- 分散式鎖的問題,可以參考一下這篇文章
- 這些資料庫之間有什麼區別,什麼情況會選哪種資料庫。考慮的方向是:有沒有一些ACID的需求;是否需要持久化;索引的情況等。
1.5.分散式理論
這個可能就比較泛了,cap理論、分散式事務(兩階段提交等)、一致性演算法和協同演算法等。這些可能更多的是看自己的喜好了,因為理解起來真的是比較困難。
2.簡歷
這個就更加重要了,簡歷是一個人的門面。對一些沒有大型網際網路公司、沒有比較好的學歷的人來說,一份好的簡歷就更加重要了,畢竟你比別人少了兩個加分項。針對我收的簡歷,我列舉一下容易出現的問題。
- 排版:排版是一個人思路是否清晰的體現,一份好的簡歷最好能夠模組化。這樣面試官可以非常容易找到自己想要的東西。不要把不一樣的東西混在一起,上次收的一份簡歷,個人技能和基本資訊混在一起,讓人看了就不是很舒服。
- 技能:可以像我上面那樣,把技能分成幾塊。每一塊最好能夠展開一下,說一些比較具體的內容,而不是詞語簡單的堆砌。比如Java多執行緒,這個詞就可以稍微的展開一下,可以寫AbstractQueuedSynchronizer等;這樣面試官起碼知道你是有看過原始碼的,比你只說看過原始碼會好一些。
- 專案:專案不僅僅寫專案的內容,要談談遇到的什麼問題,你是怎麼思考和解決的。我收到的簡歷裡面比較普遍的問題是:把那個專案名字換成一個外包專案,完全沒有違和感,太籠統了,太萬金油了。專案在精,而不在多,最好每個專案能夠體現你使用到的不一樣的技術,這樣專案就和你的技能相呼應,給人感覺就會比較靠譜。
- 針對jd做一些優化:有一些jd是需要特殊背景的(例如金融行業),這個時候就需要思考這個行業的難點了,否則如何能夠勝任呢?以金融為例:你是如何保證服務不出錯的,如何設計保證冪等的,訊息佇列如何保證不丟的(我隨便舉的例子,可能不是很恰當,因為我也不太懂)
分享幾張技能圖,方便大家查漏補缺。掌握了這些,對於要求3~5年工作經驗的崗位應該問題不大。
最後想要內推阿里的可以加我脈脈~~