本書是一本講解Java程序員面試筆試的實用工具書。在寫法上,除了講解如何解答Java程序員面試筆試問題以外,還引入了相關(guān)知識點輔以說明,讓讀者能夠更加容易地理解和掌握。
本書囊括Java程序員面試筆試過程中的各類知識點。在內(nèi)容廣度上,搜集了近3年來幾乎所有IT企業(yè)針對Java崗位的筆試面試涉及的知識點,包括但不限于Java核心知識點(容器、多線程和IO等)、Java Web(Struts、MyBatis、Kafka、Spring等)、數(shù)據(jù)庫,所選擇知識點均為企業(yè)招聘時所考查的知識點。在講解的深度上,本書由淺入深,詳細(xì)分析每一個知識點,并提煉歸納,同時,引入相關(guān)知識點,并對其進行深度剖析,讓讀者不僅能夠理解每個知識點,還能在遇到相似問題的時候,也能游刃有余地解決,而這些內(nèi)容很多是其他同類書籍所沒有的。書中根據(jù)知識點進行分門別類,結(jié)構(gòu)合理,條理清晰,便于讀者進行學(xué)習(xí)與檢索。
本書是一本計算機相關(guān)專業(yè)畢業(yè)生面試、筆試的求職用書,同時也適合期望在計算機軟、硬件行業(yè)大顯身手的計算機愛好者閱讀。
《Java程序員面試筆試寶典》已經(jīng)出版了多年,在讀者中產(chǎn)生了強烈反響,很多讀者反映該書不錯,對他們求職就業(yè)起到了非常積極的作用。近期有熱心的讀者反饋書中的部分知識點比較陳舊,而且Java Web相關(guān)的知識點太少。為了更好地滿足讀者的需求,我萌發(fā)了對其進行修訂的想法,在我看來,只有不斷與讀者進行交流并得知他們真實的想法與需求,并把這些需求都放在書中體現(xiàn)出來才能幫助到更多的讀者。
我雖然不是計算機方面的權(quán)威,也非Java語言方面的專家,但愿意將自己的所學(xué)、所知與所想無私地與眾多學(xué)弟學(xué)妹們分享,讓他們在求職的道路上能夠越來越順,少走我們曾經(jīng)走過的彎路。
其實,近些年來,無論是傳統(tǒng)的互聯(lián)網(wǎng)應(yīng)用,還是當(dāng)前發(fā)展迅猛的云計算、海量數(shù)據(jù)處理以及移動互聯(lián)網(wǎng),都離不開Java語言,Java語言始終在信息技術(shù)浪潮中扮演著極其重要的角色,從歷次編程語言排行榜的榜單不難看出,Java語言與C語言的應(yīng)用地位和規(guī)模不分伯仲,它們無愧于計算機歷重要的編程語言。鑒于此,很多主流IT企業(yè),例如大型互聯(lián)網(wǎng)企業(yè)(門戶網(wǎng)站、即時通信、電子商務(wù)、搜索引擎等)、手機應(yīng)用開發(fā)企業(yè)等都會使用Java語言作為開發(fā)語言,當(dāng)他們招賢納士時,自然而然地希望求職者能夠熟悉Java語言的基本原理,并能夠熟練使用Java語言從事實際的項目研發(fā)。
本書延續(xù)并繼承了版的很多經(jīng)典內(nèi)容:Java基礎(chǔ)知識、Java Web基礎(chǔ)知識等,另一方面,結(jié)合當(dāng)前的實際情況與讀者的反饋從以下幾個方面做了改動:
1)刪除了部分陳舊的知識點(jsp與EJB等),增加了部分知識點(Spring、Redis等)的新特性;
2)針對部分熱點問題如MyBatis、Kafka,增加了對其內(nèi)部實現(xiàn)原理的解析;
3)增加了大量Java Web相關(guān)的知識點。
本書在編寫過程中,得到了機械工業(yè)出版社時靜與尚晨兩位編輯的大力支持與通力配合。創(chuàng)作的過程是一個自我斗爭、自我救贖的過程,充滿了孤獨,無數(shù)個節(jié)假日,無數(shù)個深夜,當(dāng)其他人沉浸在幸福美滿的快樂生活中的時候,我們需要安靜地坐在計算機前,將文字內(nèi)容反復(fù)提煉,力求簡單明了,并將實例代碼一一驗證,力求準(zhǔn)確無誤。盡管孤獨,但我們不寂寞,我們覺得自己所做的事情非常有意義,只要付出的辛苦能換來求職者們滿意的工作,我們就心滿意足了。
由于編者水平有限,書中不足之處在所難免,還望讀者見諒。讀者如果發(fā)現(xiàn)問題或有困惑,都可以通過郵箱xdhehao@foxmail.com或者xdxuepeng@foxmail.com聯(lián)系編者。
編 者
前言
第1部分
Java核心知識
第1章 Java基礎(chǔ)知識/2
1.1 Java程序初始化的順序/2
1.2 構(gòu)造方法/3
1.3 Java中clone方法的作用/4
1.4 反射/8
1.5 Lambda表達式/11
1.6 多態(tài)的實現(xiàn)機制/13
1.7 Overload和Override的區(qū)別/14
1.8 abstract class(抽象類)與
interface(接口)的異同/15
1.9 break、continue以及return的
區(qū)別/17
1.10 switch使用時的注意事項/17
1.11 volatile的作用/20
1.12 Java基本的數(shù)據(jù)類型/23
1.13 不可變類/24
1.14 值傳遞與引用傳遞的區(qū)別/26
1.15 i與i 的區(qū)別/29
1.16 字符串創(chuàng)建與存儲的機制/30
1.17 ==、equals和hashCode的
區(qū)別/36
1.18 String、StringBuffer、StringBuilder
和StringTokenizer的區(qū)別/37
1.19 finally塊中的代碼什么時候被
執(zhí)行/39
1.20 異常處理/42
1.21 常見面試筆試真題/42
第2章 流/52
2.1 輸入輸出流/52
2.1.1 Java IO流的實現(xiàn)機制/52
2.1.2 管理文件和目錄的類/54
2.1.3 Java Socket/55
2.1.4 Java序列化/55
2.2 同步與異步、阻塞與非阻塞/58
2.3 BIO/59
2.4 NIO/60
2.4.1 Buffer/61
2.4.2 Channel/63
2.4.3 Selector/65
2.4.4 AIO/69
2.5 常見面試筆試真題/72
第3章 容器/74
3.1 Collections框架/74
3.2 ArrayList、Vector和LinkedList的
區(qū)別/75
3.3 Map/76
3.3.1 HashMap/76
3.3.2 Java8之前的HashMap/78
3.3.3 Java8提供的HashMap/79
3.3.4 TreeMap/80
3.3.5 LinkedhashMap/81
3.3.6 Java8之前的LinkedHashMap/81
3.3.7 Java8中的LinkedHashMap/82
3.3.8 Hashtable/86
3.3.9 WeakHashMap/87
3.3.10 HashMap、HashTable、TreeMap
和WeakHashMap的區(qū)別/90
3.3.11 用自定義類型作為HashMap或Hashtable
的key需要注意的問題/90
3.3.12 ConcurrentHashMap/94
3.4 Set/98
3.4.1 HashSet/99
3.4.2 LinkedHashSet/99
3.4.3 TreeSet/100
3.5 BlockingQueue/100
3.5.1 ArrayBlockingQueue/101
3.5.2 LinkedBlockingQueue/103
3.5.3 PriorityBlockingQueue/104
3.5.4 ConcurrentLinkedQueue/106
3.5.5 DelayQueue/108
3.6 Collection 和 Collections的
區(qū)別/110
3.7 迭代器/111
3.8 并行數(shù)組/112
3.9 常見面試筆試真題/113
第4章 多線程/121
4.1 線程與進程/121
4.2 同步和異步有什么區(qū)別/122
4.3 如何實現(xiàn)Java多線程/122
4.4 run與start的區(qū)別/125
4.5 多線程同步/126
4.6 Lock的分類/129
4.7 synchronized與Lock的異同/135
4.8 sleep與wait的區(qū)別/139
4.9 終止線程的方法/140
4.10 死鎖/141
4.11 守護線程/141
4.12 join方法的作用/142
4.13 如何捕獲一個線程拋出的
異常/143
4.14 線程池/145
4.14.1 Executor接口/145
4.14.2 ExecutorService/146
4.14.3 ThreadPoolExecutor/147
4.14.4 線程池的使用方法/149
4.15 ThreadLocal/152
4.15.1 應(yīng)用實例/152
4.15.2 原理解析/153
4.15.3 改進/155
4.16 Latch/155
4.17 Barrier/156
4.18 Java中的Fork/Join框架/157
4.19 CAS/162
4.20 線程調(diào)度與優(yōu)先級/165
4.21 常見面試筆試真題/166
第5章 內(nèi)存分配/169
5.1 JVM內(nèi)存劃分/169
5.2 運行時內(nèi)存劃分/171
5.2.1 年輕代、老年代與永久代/171
5.2.2 元空間MetaSpace/172
5.3 垃圾回收/173
5.3.1 垃圾回收算法/173
5.3.2 串行垃圾回收/175
5.3.3 并行垃圾回收/176
5.3.4 并發(fā)標(biāo)記清理回收/176
5.3.5 G1/178
5.3.6 Shenandoah/180
5.4 Java平臺與內(nèi)存管理/180
5.4.1 為什么說Java是平臺獨立性
語言/180
5.4.2 Java平臺與其他語言平臺的區(qū)別/181
5.4.3 JVM加載class文件的原理機制/181
5.4.4 Java是否存在內(nèi)存泄漏問題/182
5.4.5 Java中的堆和棧的區(qū)別/184
5.4.6 JVM常用的參數(shù)/185
5.5 常見面試筆試真題/187
第6章 設(shè)計模式/188
6.1 設(shè)計模式中的原則/188
6.1.1 單一職責(zé)原則/188
6.1.2 開放封閉原則/189
6.1.3 里氏替換原則/191
6.1.4 依賴倒置原則/192
6.1.5 接口隔離原則/193
6.1.6 合成復(fù)用原則/194
6.1.7 迪米特法則/195
6.2 單例模式/195
6.3 工廠模式/196
6.4 適配器模式/197
6.5 觀察者模式/198
6.6 常見面試筆試真題/199
第2部分
Java Web核心知識
第7章 Struts/203
7.1 Struts框架/203
7.2 Struts框架響應(yīng)客戶請求的工作
流程/205
7.3 Struts框架的數(shù)據(jù)驗證/205
7.4 Form Bean的表單驗證流程/205
7.5 元素包含的屬性/206
7.6 ActionForm Bean的作用/206
7.7 Struts2的請求處理流程/206
7.8 Struts2中的攔截器/207
7.9 Struts2國際化/207
7.10 常見面試筆試真題/208
第8章 MyBatis/209
8.1 MyBatis緩存的基本概念/209
8.2 MyBatis分頁/210
8.3