第1章 數組及其內存管理 1
1.1 數組初始化 2
1.1.1 Java數組是靜態的 2
1.1.2 數組一定要初始化嗎 5
1.1.3 基本類型數組的初始化 7
1.1.4 引用類型數組的初始化 9
1.2 使用數組 12
1.2.1 數組元素就是變量 12
1.2.2 沒有多維數組 14
1.3 本章小結 20
第2章 對象及其內存管理 21
2.1 實例變量和類變量 22
2.1.1 實例變量和類變量的屬性 23
2.1.2 實例變量的初始化時機 26
2.1.3 類變量的初始化時機 30
2.2 父類構造器 32
2.2.1 隱式調用和顯式調用 32
2.2.2 訪問子類對象的實例變量 34
2.2.3 調用被子類重寫的方法 37
2.3 父子實例的內存控製 39
2.3.1 繼承成員變量和繼承方法的區彆 39
2.3.2 內存中子類實例 42
2.3.3 父、子類的類變量 47
2.4 final修飾符 48
2.4.1 final修飾的變量 48
2.4.2 執行“宏替換”的變量 53
2.4.3 final方法不能被重寫 57
2.4.4 內部類中的局部變量 59
2.5 本章小結 62
第3章 常見Java集閤的實現細節 63
3.1 Set和Map 64
3.1.1 Set和Map的關係 64
3.1.2 HashMap和HashSet 69
3.1.3 TreeMap和TreeSet 79
3.2 Map和List 85
3.2.1 Map的values()方法 85
3.2.2 Map和List的關係 91
3.3 ArrayList和LinkedList 92
3.3.1 Vector和ArrayList的區彆 94
3.3.2 ArrayList和LinkedList的實現差異 97
3.3.3 ArrayList和LinkedList的性能分析及適用場景 101
3.4 Iterator迭代器 101
3.4.1 Iterator實現類與迭代器模式 102
3.4.2 迭代時刪除指定元素 103
3.5 本章小結 106
第4章 Java的內存迴收 107
4.1 Java引用的種類 108
4.1.1 對象在內存中的狀態 108
4.1.2 強引用 111
4.1.3 軟引用 111
4.1.4 弱引用 114
4.1.5 虛引用 118
4.2 Java的內存泄漏 119
4.3 垃圾迴收機製 123
4.3.1 垃圾迴收的基本算法 123
4.3.2 堆內存的分代迴收 125
4.3.3 與垃圾迴收相關的附加選項 127
4.3.4 常見的垃圾迴收器 127
4.4 內存管理小技巧 131
4.4.1 盡量使用直接量 132
4.4.2 使用StringBuilder和StringBuffer進行字符串連接 132
4.4.3 盡早釋放無用對象的引用 132
4.4.4 盡量少用靜態變量 133
4.4.5 避免在經常調用的方法、循環中創建Java對象 133
4.4.6 緩存經常使用的對象 134
4.4.7 盡量不要使用finalize方法 134
4.4.8 考慮使用SoftReference 135
4.5 本章小結 135
第5章 錶達式中的陷阱 136
5.1 關於字符串的陷阱 137
5.1.1 JVM對字符串的處理 137
5.1.2 不可變的字符串 140
5.1.3 字符串比較 142
5.2 錶達式類型的陷阱 144
5.2.1 錶達式類型的自動提升 144
5.2.2 復閤賦值運算符的陷阱 145
5.2.3 Java 7新增的二進製整數 147
5.3 輸入法導緻的陷阱 148
5.4 注釋字符必須閤法 149
5.5 轉義字符的陷阱 149
5.5.1 慎用字符的Unicode轉義形式 149
5.5.2 中止行注釋的轉義字符 150
5.6 泛型可能引起的錯誤 151
5.6.1 原始類型變量的賦值 151
5.6.2 原始類型帶來的擦除 153
5.6.3 創建泛型數組的陷阱 155
5.7 正則錶達式的陷阱 157
5.8 多綫程的陷阱 158
5.8.1 不要調用run方法 158
5.8.2 靜態的同步方法 160
5.8.3 靜態初始化塊啓動新綫程執行初始化 162
5.8.4 注意多綫程執行環境 167
5.9 本章小結 171
第6章 流程控製的陷阱 172
6.1 switch語句陷阱 173
6.1.1 default分支永遠會執行嗎 173
6.1.2 break的重要性 174
6.1.3 Java 7增強的switch錶達式 176
6.2 標簽引起的陷阱 177
6.3 if語句的陷阱 178
6.3.1 else隱含的條件 178
6.3.2 小心空語句 181
6.4 循環體的花括號 182
6.4.1 什麼時候可以省略花括號 182
6.4.2 省略花括號的危險 183
6.5 for循環的陷阱 185
6.5.1 分號惹的禍 185
6.5.2 小心循環計數器的值 188
6.5.3 浮點數作循環計數器 188
6.6 foreach循環的循環計數器 190
6.7 本章小結 192
第7章 麵嚮對象的陷阱 193
7.1 instanceof運算符的陷阱 194
7.2 構造器的陷阱 198
7.2.1 構造器之前的void 198
7.2.2 構造器創建對象嗎 199
7.2.3 無限遞歸的構造器 203
7.3 持有當前類的實例 205
7.4 到底調用哪個重載的方法 206
7.5 方法重寫的陷阱 209
7.5.1 重寫private方法 209
7.5.2 重寫其他訪問權限的方法 210
7.6 非靜態內部類的陷阱 211
7.6.1 非靜態內部類的構造器 211
7.6.2 非靜態內部類不能擁有靜態成員 213
7.6.3 非靜態內部類的子類 214
7.7 static關鍵字 215
7.7.1 靜態方法屬於類 215
7.7.2 靜態內部類的限製 217
7.8 native方法的陷阱 217
7.9 本章小結 219
第8章 異常處理的陷阱 220
8.1 正確關閉資源的方式 221
8.1.1 傳統關閉資源的方式 221
8.1.2 使用Java 7增強的try語句關閉資源 224
8.2 finally塊的陷阱 226
8.2.1 finally的執行規則 226
8.2.2 finally塊和方法返迴值 227
8.3 catch塊的用法 229
8.3.1 catch塊的順序 229
8.3.2 不要用catch代替流程控製 231
8.3.3 隻有catch可能拋齣的異常 232
8.3.4 做點實際的修復 235
8.4 繼承得到的異常 237
8.5 Java 7增強的throw語句 238
8.6 本章小結 240
第9章 綫性錶 241
9.1 綫性錶概述 242
9.1.1 綫性錶的定義及邏輯結構 242
9.1.2 綫性錶的基本操作 243
9.2 順序存儲結構 243
9.3 鏈式存儲結構 248
9.3.1 單鏈錶上的基本運算 249
9.3.2 循環鏈錶 255
9.3.3 雙嚮鏈錶 256
9.4 綫性錶的分析 262
9.4.1 綫性錶的實現分析 262
9.4.2 綫性錶的功能 263
9.5 本章小結 264
第10章 棧和隊列 265
10.1 棧 266
10.1.1 棧的基本定義 266
10.1.2 棧的常用操作 267
10.1.3 棧的順序存儲結構及實現 267
10.1.4 棧的鏈式存儲結構及實現 272
10.1.5 Java集閤中的棧 275
10.2 隊列 275
10.2.1 隊列的基本定義 275
10.2.2 隊列的常用操作 276
10.2.3 隊列的順序存儲結構及實現 276
10.2.4 循環隊列 280
10.2.5 隊列的鏈式存儲結構及實現 284
10.2.6 Java集閤中的隊列 287
10.3 雙端隊列 288
10.4 本章小結 289
第11章 樹和二叉樹 290
11.1 樹的概述 291
11.1.1 樹的定義和基本術語 291
11.1.2 樹的基本操作 292
11.1.3 父節點錶示法 293
11.1.4 子節點鏈錶示法 296
11.2 二叉樹 301
11.2.1 二叉樹的定義和基本概念 301
11.2.2 二叉樹的基本操作 302
11.2.3 二叉樹的順序存儲 303
11.2.4 二叉樹的二叉鏈錶存儲 306
11.2.5 二叉樹的三叉鏈錶存儲 310
11.3 遍曆二叉樹 313
11.3.1 先序遍曆 314
11.3.2 中序遍曆 314
11.3.3 後序遍曆 315
11.3.4 廣度優先(按層)遍曆 316
11.4 轉換方法 316
11.4.1 森林、樹和二叉樹的轉換 317
11.4.2 樹的鏈錶存儲 318
11.5 哈夫曼樹 318
11.5.1 哈夫曼樹的定義和基本概念 319
11.5.2 創建哈夫曼樹 319
11.5.3 哈夫曼編碼 322
11.6 排序二叉樹 323
11.7 紅黑樹 331
11.7.1 插入操作 332
11.7.2 刪除操作 335
11.8 本章小結 344
第12章 常用的內部排序 345
12.1 排序的基本概念 346
12.1.1 排序概述 346
12.1.2 內部排序的分類 347
12.2 選擇排序法 347
12.2.1 直接選擇排序 347
12.2.2 堆排序 351
12.3 交換排序 356
12.3.1 冒泡排序 356
12.3.2 快速排序 358
12.4 插入排序 360
12.4.1 直接插入排序 360
12.4.2 摺半插入排序 362
12.4.3 Shell排序 364
12.5 歸並排序 367
12.6 桶式排序 370
12.7 基數排序 372
12.8 本章小結 375
第13章 程序開發經驗談 376
13.1 紮實的基本功 377
13.1.1 快速的輸入能力 377
13.1.2 編程實現能力 379
13.1.3 快速排錯 379
13.2 程序開發之前 380
13.2.1 分析軟件的組件模型 380
13.2.2 建立軟件的數據模型 383
13.3 理清程序的實現流程 384
13.3.1 各組件如何通信 384
13.3.2 人機交互的實現 386
13.3.3 復雜算法的分析 388
13.4 編寫開發文檔 391
13.4.1 繪製建模圖、流程圖 391
13.4.2 提供簡要說明 393
13.4.3 編寫僞碼實現 393
13.5 編碼實現和開發心態 394
13.5.1 開發是復雜的 394
13.5.2 開發過程是漫長的 394
13.6 本章小結 395
第14章 程序調試經驗談 396
14.1 程序的可調試性 397
14.1.1 增加注釋 397
14.1.2 使用log 397
14.2 程序調試的基本方法 405
14.2.1 藉助編譯器的代碼審查 405
14.2.2 跟蹤程序執行流程 408
14.2.3 斷點調試 409
14.2.4 隔離調試 411
14.2.5 錯誤重現 412
14.3 記錄常見錯誤 414
14.3.1 常見異常可能的錯誤原因 414
14.3.2 常見運行時異常可能的錯誤原因 416
14.4 程序調試的整體思路 417
14.4.1 分段調試 418
14.4.2 分模塊調試 419
14.5 調試心態 419
14.5.1 誰都會齣錯 420
14.5.2 調試比寫程序更費時 420
14.6 本章小結 420
第15章 IDE工具心法談 421
15.1 何時開始利用IDE工具 422
15.2 IDE工具概述 423
15.2.1 IDE工具的基本功能 424
15.2.2 常見的Java IDE工具 425
15.3 項目管理 428
15.3.1 建立項目 428
15.3.2 自動編譯 434
15.3.3 自動部署、運行 435
15.4 代碼管理 436
15.4.1 嚮導式的代碼生成 436
15.4.2 代碼生成器 438
15.4.3 代碼提示 439
15.4.4 自動代碼補齊 441
15.4.5 實時錯誤提示 441
15.5 項目調試 442
15.5.1 設置斷點 442
15.5.2 單步調試 444
15.5.3 步入、步齣 445
15.6 團隊協作功能 446
15.7 本章小結 450
第16章 軟件測試經驗談 451
16.1 軟件測試概述 452
16.1.1 軟件測試的概念和目的 452
16.1.2 軟件測試的分類 454
16.1.3 開發活動和測試活動 454
16.1.4 常見的Bug管理工具 455
16.2 單元測試 456
16.2.1 單元測試概述 456
16.2.2 單元測試的邏輯覆蓋 458
16.2.3 JUnit介紹 461
16.2.4 JUnit的用法 461
16.3 係統測試和自動化測試 467
16.3.1 係統測試概述 467
16.3.2 自動化測試 468
16.3.3 常見的自動化測試工具 469
16.4 性能測試 470
16.4.1 性能測試概述 470
16.4.2 性能測試的相關概念 471
16.4.3 常見的性能測試工具 472
16.5 本章小結 472
· · · · · · (
收起)