?求職經驗(Java開發)
時間節點
-
對於我們專業的孩子來說,一般可以經歷4次校招,分別是:
- 實習(3月份開始)
- 內推/提前批/管培生(6月份開始)
- 秋招(9月份開始)
- 春招(次年3月份開始)
-
不是要大家每個都參加,拿到心怡的offer就可以收手了,重點是注意下時間節點,越往後面的意味着你可能準備的更充分,但同時坑就那麼多,越往後面坑越少。需要根據自己的能力和準備的充分程度來選擇合適的入場時機,或者說根據自己計劃的入場時間提前做準備。
-
同一家公司,參加前面的招聘,理論上或者說官方說明上是不影響下一次招聘的,但這應該不是事實上。事實上每次參加招聘都會在目標公司的招聘系統上留下“案底”,在下一次投遞崗位的時候,“案底”會作爲評估你的一個依據,好的“案底”就是加分項,太差的“案底”會讓對方直接不考慮你了,畢竟招聘也是要花費時間和金錢的,對方也不想浪費時間。幾次招聘在難度上沒有太大的差異的,儘早參加可以讓你提前經歷筆試面試,知道面試官會問哪方面的問題,可以拿一些並不是很想去的公司提前練練手。
-
如果你不是大神,提前做準備是非常必要的(事實上大神也會做準備)。筆面試其實和備考差異不大,往年的筆試題、面試經驗都是等效於劃重點的寶貴材料。我曾經面試的一家公司,面試官拿着一個小冊子問我,他說這是公司要求,公司列出了必考察的幾個點,然後每個點列出了一些常見的問題供面試官參考,如果能提前熟悉這個小冊子不就可以如魚得水了。
-
當然不是每家公司都有這種小冊子,面試前你也無法確定你的面試官,沒有固定招數的面試官一般就會問自己熟悉的,不然他也無法確定你回答的正確度。舉個例子,對於軟件工程師這個崗位,一般投簡歷的時候Java工程師和C++工程師是兩個崗位,細心點的公司面試的時候會讓搞Java開發的去面試投遞Java崗位的,搞C++的去去面試投遞C++崗位的,但並不是所有公司都這樣。我校招的時候除了幾個算法崗,投的全是Java開發,我遇到的面試官有:
- 搞C++的,然後問我數據結構
- 搞Java的,問Java基礎、集合源碼、併發、JVM、算法
- 搞網絡的,問TCP、HTTP、DNS
- 不會Java的,問數據庫
-
總結一下,如果他不會你這門語言,而你投遞的又是這個崗位,那他不會在語言與算法上難爲你,這一環節就跳過了(算法一般是要你寫的,你寫了他不一定看得懂,所以就跟着跳過了),那麼剩下的就問基礎知識和項目經歷了,知識面廣一點的就問你:
- 數據結構
- 操作系統
- 數據庫
- 計算機網絡
知識面窄一點的就只問他會的。
-
如何關注每個公司招聘開始的時間節點:
- 可以參考牛客網校招日程
- 關注你心怡公司的招聘公衆號,拿到一手官方消息
- 關注校園宣講會
- 目標公司的熟人內推
- 可以參考牛客網校招日程
筆試
筆試一般就是選擇題+編程題,不同的公司會有不同的比重,有些公司只有編程題,而國企可能選擇題多一點。
選擇題的內容主要涉及:
- 一門編程語言
- 數據結構與算法
- 設計模式
- 操作系統
- 計算機網絡
- 數據庫
編程題就是要你用代碼去求解某個問題
筆試題的練習可以在賽碼網或者牛客網 (活躍在牛客上還挺好玩的)
編程題的練習可以在leetcode或者leetcode中國,也可以在賽碼網或者牛客網上練習各公司的往年編程題。
建議在練習的時候,每週將做過的題整理一遍,寫上註釋,放在一個持續更新的Project或者Repository中,就像我的這個Repository。在真正網上筆試的時候,大部分編程題是可以切出來在本地IDE上編程的,如果這道題你做過或者做過類似的,完全可以去翻你曾經的代碼,然後直接套用或做簡單的修改,比你再碼一遍快的太多。
面試
在面試一家公司之前,我覺得至少要做這幾項調研:
- 該公司是幹什麼的。重資產還是輕資產,是賣產品的還是賣服務的
- 你投遞的這一崗位可能是幹什麼的
- 該公司的主要技術結構。比如阿里就是Java,騰訊C++,百度PHP,當然這是主要的技術結構,一家大型公司涉及的開發語言多達十幾種,但總有一兩個是主要的,而從事該語言開發的員工也是最多的,也就是說,需求這類職位比較多,同時你的面試官從事這個方向的概率比較高。就國內而言,整體來說,搞遊戲的大部分是C++,賣嵌入式產品的C和C++,賣嵌入式產品和服務的C、C++和Java,互聯網公司Java或者C++再加上前端,賣手機的C++、Java、Android、前端,等等。
- 幾輪面試,每輪面什麼。就我個人經歷來說,一般的邀請到酒店大堂面試的,就兩輪,一天搞定,第一輪技術面,過了就第二輪HR面或者第二輪是主管技術面,算是比較輕鬆的,過或者涼都很快。還有一類公司是一天只面一面,在面試官酒店房間一對一,完了讓你回去等二面通知,這類一般3面以上,一面考你編程語言和算法基礎,二面考你綜合基礎知識和項目經歷,3面才HR或者主管面。
我將我之前面試準備的一些知識點羅列如下:
- Java基礎
- 數據結構
- 隊列
- 鏈表
- 數組
- 棧
- 堆
- 樹
- 二叉樹
- 完全二叉樹
- 平衡二叉樹
- 二叉查找樹
- 紅黑樹
- B-,B+,B*樹
- LSM樹
- Set
- Map
- 算法
- 排序算法
- 選擇排序
- 冒泡排序
- 插入排序
- 快速排序
- 歸併排序
- 希爾排序
- 堆排序
- 計數排序
- 桶排序
- 基數排序
- 查找算法
- 二分查找
- 字符串比較
- KMP算法
- 布隆過濾器
- 深度優先
- 廣度優先
- 貪心算法
- 回溯算法
- 動態規劃
- 排序算法
- JVM
- JVM內存劃分
- JVM內存溢出
- 垃圾回收
- 如何判斷對象已死
- 回收算法
- 垃圾收集器
- 回收過程
- JVM性能優化
- 類加載
- 類的生命週期
- 類加載器
- Java集合源碼
- Vector
- ArrayList
- LinkedList
- HashMap
- Hashtable
- HashSet
- TreeMap
- ConcurrentHashMap
- 數據庫
- 三大範式
- 索引
- 引擎
- 事務
- 隔離
- 鎖
- 數據庫性能優化
- 併發
- 併發的優缺點
- 線程
- 創建線程
- 線程狀態切換
- 線程的基本操作
- 守護線程
- 什麼是線程安全
- 鎖
- 公平鎖&非公平鎖
- 悲觀鎖&樂觀鎖
- 可重入鎖&不可重入鎖
- 互斥鎖&共享鎖
- 死鎖
- 產生死鎖的四個必要條件
- 預防和解除
- 構建死鎖
- 查看死鎖
- 併發理論
- JMM內存模型
- 重排序
- happens-before原則
- 併發關鍵字
- synchronized
- volatile
- final
- 原子性、可見性、有序性
- Lock體系
- Lock與Synchronized比較
- AQS
- AQS源碼解析
- ReentrantLock
- ReentrantReadWriteLock
- Condition機制
- LockSupport
- 併發容器
- ConcurrentHashMap
- CopyOnWriteArrayList
- BlockingQueue
- ConcurrentLinkedQueue
- 線程池
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
- 原子操作類
- 併發工具
- CountDownLatch
- CyclicBarrier
- Semaphore
- Exchanger
- 併發實戰:生產-消費者問題
- wait/notifyAll實現
- await/signalAll實現
- BlockingQueue實現
- 設計模式
- 23種常見的設計模式
- JDK中的設計模式
- Spring中的設計模式
- MyBatis中的設計模式
- Spring
- IOC
- AOP
- 操作系統
- 進程、線程、協程
- Linux命令行
- 網絡
- OSI七層模型
- TCP/IP
- HTTP/HTTP2.0/HTTPS
- 長連接、短連接
- 網絡模型
- Epoll
- Java NIO
- Netty
我將我之前面試準備的面試題目記錄如下:
- 什麼是二叉樹
- B樹與B+樹
- TCP三次握手、四次揮手的過程
- 類加載器有哪些
- JVM垃圾回收算法
- 垃圾收集器
- HTTP請求和響應內容
- 線程創建方式
- HashMap和ConcurrentHashMap的實現原理
- TCP/IP協議簇有哪些常見協議
- Java線程池的核心屬性以及處理流程
- Java併發包原理
- 線程的生命週期
- JVM類加載機制
- JVM內存模型
- 數據庫有哪些索引,索引原理
- JVM內存溢出有哪些
- Java8有哪些新特性
- HTTP請求的GET和POST分別是什麼
- Session、Cookie、Token的區別
- HashMap工作原理及代碼實現,什麼時候用到紅黑樹
- ConcurrentHashMap工作原理及代碼實現,如何統計所有元素個數
- 線程和進有哪些程的概念
- 並行和併發的概念
- 進程間通信方式
- Semaphore原理
- Exchanger原理
- ThreadLocal原理,爲什麼會出現OOM,出現的深層次原因
- 線程池實現原理
- 線程池的幾種實現方式
- 如何保證線程安全
- 重入鎖的概念,重入鎖爲什麼可以防止死鎖
- 產生死鎖的四個條件
- Volatile實現原理
- synchronized實現原理
- synchronized與lock區別
- CAS無鎖的概念
- 樂觀鎖和悲觀鎖
- 什麼是ABA問題
- 偏向鎖、輕量級鎖、重量級鎖、自旋鎖的概念
- JVM OOM和SOE的示例及原因,如何排查與解決
- 如何判斷對象是否可以回收
- 類加載器、雙親委派模型、類的生命週期、類如何加載到JVM中
- JVM內存模型
- 常見設計模式
- 設計模式六大原則
- 紅黑樹
- 一致性Hash原理,Hash環問題
- BIO、NIO、AIO的概念
- 長連接與短連接
- HTTP/HTTP2.0/HTTPS的區別
- 從瀏覽器地址欄輸入URL到頁面加載之間發生了什麼
- DDL/DML/DCL分別指什麼
- 數據庫事務的ACID
- 事務隔離級別
- InnoDB與MyISAM的區別
- 數據庫索引類別
- 什麼是自適應哈希
- 聚集索引與非聚集索引的區別
- 爲什麼使用B+樹作爲MySQL的索引
- Servlet生命週期
- Spring Bean生命週期
- Spring IOC如何實現
- Spring AOP如何實現
- Spring事務
- Spring MVC
- Tomcat基礎架構
- Hash衝突解決辦法
- ArrayList和LinkedList的默認空間是多少
- Object的Hashcode
- Collections與Arrays的sort方法默認的排序方法是啥
- 淺拷貝與深拷貝
- Java反射的作用與實現原理
- Java中的回調機制
- synchronized與ReentrantLock哪個是公平鎖
- CAS機制會出現什麼問題
- 一個線程調用start兩次會出現什麼情況
- Minor GC與Full GC分別在什麼時候發生
- 垃圾收集器各自的特點
- Java在什麼時候會出現內存泄露
- 自己寫的類被什麼類加載器加載,什麼時候加載
- 軟引用和弱引用
- 數據庫四大範式
- 數據庫死鎖如何解決
- MySQL如何實現併發
- 內存的頁面置換算法
- 進程調度算法
- TCP爲什麼可靠
- List與Set的區別
- List與Map的區別
- ArrayList與LinkedList的區別
- ArrayList與Vector的區別
- HashMap與Hashtable的區別
- HashMap與HashSet的區別
- 多線程情況下HashMap爲什麼會出現死循環問題
- 線程的狀態是如何轉移的
- AQS同步隊列
- 常見原子操作類有哪些
- 樂觀鎖的業務場景及實現方式
- 什麼是動態代理
- 最大堆與最小堆
- 單例模式的實現方法,Spring中單例的實現原理
- TCP與UDP的區別
- 使用線程池的好處
- Object類有哪些方法
- 數據庫簡歷索引的優缺點
- HashMap如何擴容
- 大量數據去重問題
- 寫SQL
參考資源
後記
- 上述提到的知識點沒有做詳細展開,一是時間有限,二是網上很容易搜到,很多人都比我解釋的好,面試題目的答案也是一樣。
- 這篇文章是我寫給學弟學妹的畢業手冊中的求職部分,完整的內容在我的github項目。