瘋狂 Java 面試講義 — 數據結構、算法與技術素養

李剛

  • 出版商: 電子工業
  • 出版日期: 2021-04-01
  • 定價: $648
  • 售價: 8.5$551
  • 語言: 簡體中文
  • 頁數: 452
  • 裝訂: 平裝
  • ISBN: 7121409372
  • ISBN-13: 9787121409370
  • 相關分類: 面試技巧
  • 立即出貨 (庫存 < 4)

買這商品的人也買了...

商品描述

本書歸納了Java學習者、工作者在工作和麵試中最容易遭遇的技術短板和算法基礎,本書把Java編程中的要點、難點和Java程序員必備的算法基礎知識收集在一起,旨在幫助讀者有針對性地提高這些看似“司空見慣”的基本功。本書內容分為四個部分,其中第一部分主要介紹Java內存管理,這部分是大多數Java程序員最容易忽略的地方——因為Java不像C語言,而且Java提供了垃圾回收機制,因此導致許多Java程序員對內存管理重視不夠;第二部分主要介紹Java編程過程中各種常見的陷阱,這些陷阱有的來自李剛老師早年的痛苦經歷,有的來自他的眾多學生的痛苦經歷,都是Java程序員在編程過程中的“前車之鑒”,希望讀者能引以為戒;第三部分主要介紹學習Java必備的算法基礎知識,包括常用數據結構的各種算法實現,這部分內容是大多數Java程序員重視不夠的地方,也是大廠面試的常考面試題;第四部分主要介紹Java程序開發的方法、經驗等,它們是李剛老師多年的實際開發經驗、培訓經驗的總結,符合初學者的習慣,更能滿足初學者的需要,因此掌握這些開發方法、經驗可以更有效地進行開發。

作者簡介

李剛,十餘年軟件開發從業經驗,瘋狂軟件教育中心教學總監。
瘋狂Java實訓營創始人,瘋狂Java體係原創圖書作者。
CSDN特邀講師。
培訓的學生已在騰訊、阿里、華為、IBM、網易等名企就職。
國內知名高端IT技術圖書作家,已出版《瘋狂Java講義》《瘋狂Python講義》《瘋狂Android講義》《輕量級Java EE企業應用實戰》《瘋狂前端開發講義》《瘋狂HTML5/CSS3/JavaScript講義》等著作。
其中瘋狂Java體系圖書均已沉澱多年,贏得極高的市場認同,多次重印,多部著作印刷數量超過10萬冊,並被多所“985”“211”院校選作教材,部分圖書已被翻譯成繁體中文版,授權到台灣。

目錄大綱

第1章數組及其內存管理1
1.1數組初始化2
1.1.1 Java數組是靜態的2
1.1.2數組一定要初始化嗎5
1.1.3基本類型數組的初始化6
1.1.4引用類型數組的初始化8
1.2使用數組11
1.2.1數組元素就是變量11
1.2.2沒有多維數組13
1.3本章小結18

第2章對象及其內存管理19
2.1實例變量和類變量20
2.1.1實例變量和類變量的屬性21
2.1 .2實例變量的初始化時機24
2.1.3類變量的初始化時機27
2.2父類構造器29
2.2.1隱式調用和顯式調用29
2.2.2訪問子類對象的實例變量31
2.2.3調用被子類重寫的方法34
2.3父、子實例的內存控制36
2.3.1繼承成員變量和繼承方法的區別36
2.3.2內存中子類實例38
2.3.3父、子類的類變量43
2.4 final修飾符44
2.4.1 final修飾的變量44
2.4.2執行“宏替換”的變量48
2.4.3 final方法不能被重寫53
2.4.4內部類中的局部變量54
2.5本章小結58

第3章常見Java集合的實現細節59
3.1 Set和Map 60
3.1.1 Set和Map的關係60
3.1.2 HashMap和HashSet 65
3.1.3 TreeMap和TreeSet 75
3.2 Map和List 81
3.2.1 Map的values( )方法81
3.2.2 Map和List的關係86
3.3 ArrayList和LinkedList 87
3.3.1 Vector和ArrayList的區別89
3.3.2 ArrayList和LinkedList的實現差異92
3.3.3 ArrayList和LinkedList的性能分析及適用場景96
3.4 Iterator迭代器97
3.4.1 Iterator實現類與迭代器模式97
3.4.2迭代時刪除指定元素98
3.5本章小結101

第4章Java的內存回收102
4.1 Java引用的種類103
4.1.1對像在內存中的狀態103
4.1.2強引用106
4.1.3軟引用106
4.1.4弱引用109
4.1.5虛引用112
4.2 Java的內存洩漏113
4.3垃圾回收機制116
4.3.1垃圾回收的基本算法117
4.3.2堆內存的分代回收118
4.3.3與垃圾回收相關的附加選項120
4.3.4常見的垃圾回收器120
4.4內存管理小技巧123
4.4.1盡量使用直接量123
4.4.2使用StringBuilder和StringBuffer
進行字符串連接123
4.4.3儘早釋放無用對象的引用123
4.4.4盡量少用靜態變量124
4.4.5避免在經常調用的方法、循環中
創建Java對象124
4.4.6緩存經常使用的對象125
4.4.7避免使用finalize方法125
4.4.8考慮使用SoftReference 125
4.5本章小結126

第5章表達式中的陷阱127
5.1關於字符串的陷阱128
5.1.1 JVM對字符串的處理128
5.1.2不可變的字符串131
5.1.3字符串比較133
5.2表達式類型的陷阱134
5.2.1表達式類型的自動提升135
5.2.2複合賦值運算符的陷阱136
5.2.3二進制整數的陷阱137
5.3輸入法導致的陷阱138
5.4註釋字符必須合法139
5.5轉義字符的陷阱139
5.5.1慎用字符的Unicode轉義形式139
5.5.2中止行註釋的轉義字符140
5.6泛型可能引起的錯誤141
5.6.1原始類型變量的賦值141
5.6.2原始類型帶來的擦除143
5.6.3創建泛型數組的陷阱145
5.7正則表達式的陷阱147
5.8多線程的陷阱148
5.8.1不要調用run方法148
5.8.2靜態的同步方法149
5.8.3靜態初始化塊啟動新線程執行初始化152
5.8.4注意多線程執行環境156
5.9本章小結160

第6章流程控制的陷阱161
6.1 switch語句的陷阱162
6.1.1 default分支永遠會執行嗎162
6.1.2 break的重要性163
6.1.3 switch支持的數據類型164
6.2標籤引起的陷阱166
6.3 if語句的陷阱166
6.3.1 else隱含的條件167
6.3.2小心空語句169
6.4循環體的花括號171
6.4.1什麼時候可以省略花括號171
6.4.2省略花括號的危險171
6.5 for循環的陷阱173
6.5.1分號惹的禍173
6.5.2小心循環計數器的值175
6.5.3浮點數作為循環計數器176
6.6 foreach循環的循環計數器178
6.7流式編程的陷阱179
6.7.1 map與flatMap的區別179
6.7.2 collect與map的區別182
6.8本章小結186

第7章面向對象的陷阱187
7.1 instanceof運算符的陷阱188
7.2構造器的陷阱191
7.2.1構造器之前的void 191
7.2.2構造器創建對象嗎192
7.2.3無限遞歸的構造器197
7.3持有當前類的實例198
7.4到底調用哪個重載的方法199
7.5方法重寫的陷阱202
7.5.1重寫private方法202
7.5.2重寫其他訪問權限的方法202
7.6非靜態內部類的陷阱203
7.6.1非靜態內部類的構造器203
7.6.2非靜態內部類不能擁有靜態成員206
7.6.3非靜態內部類的子類206
7.7 static關鍵字207
7.7.1靜態方法屬於類207
7.7.2靜態內部類的限制209
7.8 native方法的陷阱210
7.9本章小結211

第8章異常處理的陷阱212
8.1正確關閉資源的方式213
8.1.1傳統關閉資源的方式213
8.1.2使用自動關閉資源的try語句216
8.2 finally塊的陷阱217
8.2.1 finally的執行規則217
8.2 .2 finally塊和方法返回值219
8.3 catch塊的用法220
8.3.1 catch塊的順序220
8.3.2不要用catch代替流程控制222
8.3.3應該只catch可能拋出的異常223
8.3.4做點實際的修復226
8.4繼承得到的異常228
8.5本章小結229

第9章線性表230
9.1線性表概述231
9.1.1線性表的定義及邏輯結構231
9.1.2線性表的基本操作232
9.2順序存儲結構232
9.3鍊式存儲結構237
9.3.1單鍊錶上的基本運算237
9.3.2循環鍊錶243
9.3.3雙向鍊錶244
9.4線性表的分析250
9.4.1線性表的實現分析250
9.4.2線性表的功能250
9.5本章小結251

第10章棧和隊列252
10.1棧253
10.1.1棧的基本定義253
10.1.2棧的常用操作254
10.1.3棧的順序存儲結構及實現254
10.1.4棧的鍊式存儲結構及實現258
10.1.5 Java集合中的棧261
10.2隊列262
10.2.1隊列的基本定義262
10.2.2隊列的常用操作262
10.2.3隊列的順序存儲結構及實現263
10.2.4循環隊列266
10.2.5隊列的鍊式存儲結構及實現270
10.2 .6 Java集合中的隊列273
10.3雙端隊列273
10.4本章小結275

第11章樹和二叉樹276
11.1樹的概述277
11.1.1樹的定義和基本術語277
11.1.2樹的基本操作278
11.1.3父節點表示法278
11.1.4子節點鍊錶示法282
11.2二叉樹286
11.2.1二叉樹的定義和基本概念286
11.2.2二叉樹的基本操作287
11.2.3二叉樹的順序存儲288
11.2.4二叉樹的二叉鍊錶存儲291
11.2.5二叉樹的三叉鍊錶存儲294
11.3遍歷二叉樹298
11.3.1先序遍歷298
11.3.2中序遍歷299
11.3.3後序遍歷299
11.3.4廣度優先(按層)遍歷300
11.4轉換方法301
11.4.1森林、樹和二叉樹的轉換301
11.4.2樹的鍊錶存儲302
11.5哈夫曼樹302
11.5.1哈夫曼樹的定義和基本概念303
11.5.2創建哈夫曼樹303
11.5.3哈夫曼編碼306
11.6排序二叉樹307
11.7紅黑樹314
11.7.1插入操作315
11.7.2刪除操作317
11.8本章小結327

第12章常見的內部排序328
12.1排序的基本概念329
12.1.1排序概述329
12.1.2內部排序的分類330
12.2選擇排序法330
12.2 .1直接選擇排序330
12.2.2堆排序334
12.3交換排序338
12.3.1冒泡排序338
12.3.2快速排序340
12.4插入排序342
12.4.1直接插入排序342
12.4.2折半插入排序344
12.4.3 Shell排序346
12.5歸併排序348
12.6桶式排序352
12.7基數排序354
12.8本章小結356

第13章程序開發經驗談357
13.1紮實的基本功358
13.1.1快速的輸入能力358
13.1.2編程實現能力360
13.1.3快速排錯360
13.2程序開發之前360
13.2.1分析軟件的組件模型361
13.2.2建立軟件的數據模型364
13.3釐清程序的實現流程364
13.3.1各組件如何通信365
13.3.2人機交互的實現366
13.3.3複雜算法的分析368
13.4編寫開發文檔371
13.4.1繪製建模圖、流程圖371
13.4.2提供簡要說明373
13.4.3編寫偽碼實現373
13.5編碼實現和開發心態373
13.5.1開發是複雜的374
13.5.2開發過程是漫長的374
13.6本章小結374

第14章程序調試經驗談375
14.1程序的可調試性376
14.1.1增加註釋376
14.1.2使用日誌376
14.2程序調試的基本方法377
14.2.1借助於編譯器的代碼審查377
14.2.2跟踪程序執行流程380
14.2.3斷點調試381
14.2.4隔離調試382
14.2.5錯誤重現384
14.3記錄常見錯誤385
14.3.1常見異常可能的錯誤原因385
14.3.2常見運行時異常可能的錯誤原因387
14.4程序調試的整體思路388
14.4.1分段調試388
14.4.2分模塊調試390
14.5調試心態390
14.5. 1誰都會出錯390
14.5.2調試比寫程序更費時390
14.6本章小結391

第15章IDE工具心法談392
15.1何時開始利用IDE工具393
15.2 IDE工具概述394
15.2.1 IDE工具的基本功能394
15.2.2常見的Java IDE工具396
15.3項目管理399
15.3.1建立項目399
15.3.2自動編譯406
15.3.3自動部署、運行407
15.4代碼管理408
15.4.1代碼生成器408
15.4.2代碼提示409
15.4.3自動代碼補齊410
15.4.4實時錯誤提示410
15.5項目調試411
15.5.1設置斷點411
15.5.2單步調試413
15.5.3步入、步出414
15.6團隊協作功能414
15.7本章小結417

第16章軟件測試經驗談418
16.1軟件測試概述419
16.1.1軟件測試的概念和目的419
16.1.2軟件測試的分類420
16.1.3開發活動和測試活動421
16.1.4常見的Bug管理工具421
16.2單元測試422
16.2.1單元測試概述422
16.2.2單元測試的邏輯覆蓋424
16.2.3 JUnit介紹427
16.2.4 JUnit 5.x的用法427
16.3系統測試和自動化測試438
16.3.1系統測試概述438
16.3.2自動化測試439
16.3.3常見的自動化測試工具440
16.4性能測試441
16.4.1性能測試概述441
16.4.2性能測試相關概念442
16.4.3常見的性能測試工具442
16.5本章小結443