Java 是一門歷史悠久的編程語言,可以毫無爭議地說,Java 是最主流的編程語言之一。全球有 1200 萬以上 Java 程序員以及海量的設備,還有無所不能的 Java 生態圈。
我所知道的諸如阿里巴巴、京東、百度、騰訊、美團、去哪兒等互聯網公司,基本都是以 Java 為首要編程語言的。即使在最新的云計算領域,Java 仍然是 AWS、Google App Engine 等平臺上,使用最多的編程語言;甚至是微軟 Azure 云上,Java 也以微弱劣勢排在前三位。所以,在這些大公司的面試中,基本都會以 Java 為切入點,考評一個面試者的技術能力。
應聘初級、中級 Java 工程師,通常只要求扎實的 Java 和計算機科學基礎,掌握主流開源框架的使用;Java 高級工程師或者技術專家,則往往全面考察 Java IO/NIO、并發、虛擬機等,不僅僅是了解,**更要求對底層源代碼層面的掌握,并對分布式、安全、性能等領域能力有進一步的要求**。
我在 Oracle 已經工作了近 7 年,負責過北京 Java 核心類庫、國際化、分發服務等技術團隊的組建,面試過從初級到非常資深的 Java 開發工程師。由于 Java 組工作任務的特點,我非常注重面試者的計算機科學基礎和編程語言的理解深度,我甚至不要求面試者非要精通 Java,如果對 C/C++ 等其他語言能夠掌握得非常系統和深入,也是符合需求的。
工作多年以及在面試中,我經常能體會到,有些面試者確實是認真努力工作,**但坦白說表現出的能力水平卻不足以通過面試**,通常是兩方面原因:
* “知其然不知其所以然”。做了多年技術,開發了很多業務應用,但似乎并未思考過種種**技術選擇背后的邏輯**。坦白說,我并不放心把具有一定深度的任務交給他。更重要的是,我并不確定他未來技術能力的成長潛力有多大。團隊所從事的是公司核心產品,工作于基礎技術領域,**我們不需要那些“差不多”或“還行”的代碼,而是需要達到一定水準的高質量設計與實現**。我相信很多其他技術團隊的要求會更多、更高。
* 知識碎片化,不成系統。在面試中,面試者似乎無法完整、清晰地描述自己所開發的系統,或者使用的相關技術。平時可能埋頭苦干,或者過于死磕某個實現細節,并沒有抬頭審視這些技術。比如,有的面試者,有一些并發編程經驗,但對基本的并發類庫掌握卻并不扎實,似乎覺得在用的時候進行“面向搜索引擎的編程”就足夠了。這種情況下,我沒有信心這個面試者有高效解決復雜問題、設計復雜系統的能力。
前人已經掉過的坑,后來的同學就別再“前仆后繼”了!
起初,極客時間邀請我寫《Java 核心技術 36 講》專欄,我一開始心里是懷疑其形式和必要性的。經典的書籍一大堆呀,網上也能搜到所謂的“面試寶典”呀,為什么還需要我“指手畫腳”?
但隨著深入交流,我逐漸被說服了。我發現很多面試者其實是很努力的,只是
* 很難甑別出各種技術的核心與要點,技術書籍這么龐雜,對于經驗有限的同學,找到高效歸納自己知識體系的方法并不容易。
* 各種“寶典”更專注于問題,解答大多點到即止,甚至有些解答準確性都值得商榷,缺乏系統性的分析與舉一反三的講解。
我在極客時間推出這個專欄,就是為了讓更多沒有經驗或者經驗有限的開發者,在準備面試時:
* **少走彎路,利用有限的精力,能夠更加高效地準備和學習**。
* **提綱挈領,在知識點講解的同時,為你梳理一個相對完整的 Java 開發技術能力圖譜,將基礎夯實**。
Java 面試題目千奇百怪,有的面試官甚至會以黑魔法一樣的態度,刨根問底 JVM 底層,似乎不深挖 JVM 源代碼、不談談計算機指令,就是不愛學習,這是仁者見仁智者見智的事兒。我會根據自己的經驗,圍繞 Java 開發技術的方方面面,精選出 5 大模塊,共 36 道題目,給出典型的回答,并層層深入剖析。
5 大模塊分為:
* **Java 基礎**:我會圍繞 Java 語言基本特性和機制,由點帶面,讓你構建牢固的 Java 技術工底。
* **Java 進階**:將圍繞并發編程、Java 虛擬機等領域展開,助你攻堅大廠 Java 面試的核心陣地。
* **Java 應用開發擴展**:從數據庫編程、主流開源框架、分布式開發等,幫你掌握 Java 開發的十八般兵器。
* **Java 安全基礎**:讓你理解常見的應用安全問題和處理方法,掌握如何寫出符合大廠規范的安全代碼。
* **Java 性能基礎**:你將掌握相關工具、方法論與基礎實踐。
這幾年我從業務系統或產品開發,切換到 Java 平臺自身,接觸了更多 Java 領域的核心技術,我相信我的分享能夠提供一些獨到的內容,而不是簡單的人云亦云。
時移世易,很多大家耳熟能知的問題,其實在現代 Java 里已經發生了根本性的改變。在技術領域,即使你打算或已經轉為技術管理等,扎實的技術功底也是必須的。希望通過我的專欄,不僅可以讓你面試成功,還能幫助你未來職業發展更進一步。
- 前言
- 開篇詞
- 開篇詞 -以面試題為切入點,有效提升你的Java內功
- 模塊一 Java基礎
- 第1講 談談你對Java平臺的理解?
- 第2講 Exception和Error有什么區別?
- 第3講 談談final、finally、 finalize有什么不同?
- 第4講 強引用、軟引用、弱引用、幻象引用有什么區別?
- 第5講 String、StringBuffer、StringBuilder有什么區別?
- 第6講 動態代理是基于什么原理?
- 第7講 int和Integer有什么區別?
- 第8講 對比Vector、ArrayList、LinkedList有何區別?
- 第9講 對比Hashtable、HashMap、TreeMap有什么不同?
- 第10講 如何保證集合是線程安全的? ConcurrentHashMap如何實現高效地線程安全?
- 第11講 Java提供了哪些IO方式? NIO如何實現多路復用?
- 第12講 Java有幾種文件拷貝方式?哪一種最高效?
- 第13講 談談接口和抽象類有什么區別?
- 第14講 談談你知道的設計模式?
- 模塊二 Java進階
- 第15講 synchronized和ReentrantLock有什么區別呢?
- 第16講 synchronized底層如何實現?什么是鎖的升級、降級?
- 第17講 一個線程兩次調用start()方法會出現什么情況?
- 第18講 什么情況下Java程序會產生死鎖?如何定位、修復?
- 第19講 Java并發包提供了哪些并發工具類?
- 第20講 并發包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么區別?
- 第21講 Java并發類庫提供的線程池有哪幾種? 分別有什么特點?
- 第22講 AtomicInteger底層實現原理是什么?如何在自己的產品代碼中應用CAS操作?
- 第23講 請介紹類加載過程,什么是雙親委派模型?
- 第24講 有哪些方法可以在運行時動態生成一個Java類?
- 第25講 談談JVM內存區域的劃分,哪些區域可能發生OutOfMemoryError?
- 第26講 如何監控和診斷JVM堆內和堆外內存使用?
- 第27講 Java常見的垃圾收集器有哪些?
- 第28講 談談你的GC調優思路?
- 第29講 Java內存模型中的happen-before是什么?
- 第30講 Java程序運行在Docker等容器環境有哪些新問題?
- 模塊三 Java安全基礎
- 第31講 你了解Java應用開發中的注入攻擊嗎?
- 第32講 如何寫出安全的Java代碼?
- 模塊四 Java性能基礎
- 第33講 后臺服務出現明顯“變慢”,談談你的診斷思路?
- 第34講 有人說“Lambda能讓Java程序慢30倍”,你怎么看?
- 第35講 JVM優化Java代碼時都做了什么?
- 模塊五 Java應用開發擴展
- 第36講 談談MySQL支持的事務隔離級別,以及悲觀鎖和樂觀鎖的原理和應用場景?
- 第37講 談談Spring Bean的生命周期和作用域?
- 第38講 對比Java標準NIO類庫,你知道Netty是如何實現更高性能的嗎?
- 第39講 談談常用的分布式ID的設計方案?Snowflake是否受冬令時切換影響?
- 周末福利
- 周末福利 談談我對Java學習和面試的看法
- 周末福利 一份Java工程師必讀書單
- 結束語
- 結束語 技術沒有終點
- 結課測試 Java核心技術的這些知識,你真的掌握了嗎?