內容介紹
李剛編著的《瘋狂Java程式設計師的基本修養》歸納了Java學習者、工作者在學習、工作過程中最欠缺的技術短板,本書把Java編程中的重點、要點、難點、常見陷阱收集在一起,旨在幫助讀者重點突破這些看似“司空見慣”的基本功。《瘋狂Java程式設計師的基本修養》知識主要分為四個部分,第一部分主要介紹Java程式的記憶體管理,這部分是大多Java程式設計師最容易忽略的地方——因為Java不像C,而且Java提供了垃圾回收機制,因此導致許多Java程式設計師對記憶體管理重視不夠;第二部分主要介紹了Java編程過程中各種常見的陷阱,這些陷阱有些來自於李剛老師早年痛苦的經歷,有些來自於他的眾多學子的痛苦經歷,都是Java程式設計師在編程過程中的“前車之鑑”,希望讀者能引以為戒;第三部分主要介紹常用數據結構的Java實現,這部分內容也是大多Java程式設計師重視不夠的地方——因為許多初級程式設計師往往會感覺:數據結構對實際開發幫助並不大,但實際上,我們每天開發都會使用數據結構,只是經常利用別人的實現而已;第四部分主要介紹Java程式開發的方法、經驗等,它們是李剛老師多年的實際開發經驗、培訓經驗的總結,更符合初學者的習慣,更能滿足初學者的需要,因此掌握這些開發方法、經驗可以更有效地進行開發。
本書提供了配套的網站:http://www.crazyit.org,讀者在閱讀該書過程中遇到任何技術問題都可登錄該站點與李剛老師交流,也可與瘋狂Java圖書龐大的讀者群交流。
本書不是一本包含所有技術細節的手冊,而是承載了無數過來人的諄諄教導,書中內容為有一定的Java基礎的讀者而編寫,尤其適合於有一到兩年的Java學習經驗的讀者和參加工作不久的初級Java程式設計師,幫助他們突破技術基本功的瓶頸。
作者介紹
李剛,從事10多年的Java EE套用開發,現任瘋狂軟體教育中心教學總監。瘋狂Java實訓營創始人,瘋狂Java體系圖書作者。曾任LITEON公司的J2EE技術主管,負責該公司的企業信息化平台的架構設計。
曾任廣州電信、廣東龍泉科技等公司的技術培訓導師。曾兼任廣東技術師範學院計算機科學系的兼職副教授。
2007年3月26日的《電腦報》專訪人物。
培訓的學生已在華為、立信、普信、網易、電信盈科等公司就職。
國內著名的高端IT技術作家,已出版《瘋狂Java講義》、《瘋狂Android講義》、《輕量級Java EE企業套用實戰》、《瘋狂Ajax講義》、《瘋狂XML講義》、《經典Java EE企業套用實戰》、《Struts 2.1權威指南》、《Ruby On Rails敏捷開發最佳實踐》等著作。其中瘋狂Java體系圖書都是已經得到廣泛的市場認同,並多次重印的暢銷圖書,並被多家高校選作教材,部分圖書已被翻譯成繁體中文版、輸出到台灣地區。
作品目錄
第1章數組及其記憶體管理 11.1數組初始化 2
1.1.1Java數組是靜態的 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.4final修飾符 48
2.4.1final修飾的變數 48
2.4.2執行“宏替換”的變數 53
2.4.3final方法不能被重寫 57
2.4.4內部類中的局部變數 59
2.5本章小結 62
第3章常見Java集合的實現細節 63
3.1Set和Map 64
3.1.1Set和Map的關係 64
3.1.2HashMap和HashSet 69
3.1.3TreeMap和TreeSet 79
3.2Map和List 85
3.2.1Map的values()方法 85
3.2.2Map和List的關係 91
3.3ArrayList和LinkedList 92
3.3.1Vector和ArrayList的區別 94
3.3.2ArrayList和LinkedList的實現差異 97
3.3.3ArrayList和LinkedList的性能分析及適用場景 101
3.4Iterator疊代器 101
3.4.1Iterator實現類與疊代器模式 102
3.4.2疊代時刪除指定元素 103
3.5本章小結 106
第4章Java的記憶體回收 107
4.1Java引用的種類 108
4.1.1對象在記憶體中的狀態 108
4.1.2強引用 111
4.1.3軟引用 111
4.1.4弱引用 114
4.1.5虛引用 118
4.2Java的記憶體泄漏 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.1JVM對字元串的處理 137
5.1.2不可變的字元串 140
5.1.3字元串比較 142
5.2表達式類型的陷阱 144
5.2.1表達式類型的自動提升 144
5.2.2複合賦值運算符的陷阱 145
5.2.3Java 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.1switch語句陷阱 173
6.1.1default分支永遠會執行嗎 173
6.1.2break的重要性 174
6.1.3Java 7增強的switch表達式 176
6.2標籤引起的陷阱 177
6.3if語句的陷阱 178
6.3.1else隱含的條件 178
6.3.2小心空語句 181
6.4循環體的花括弧 182
6.4.1什麼時候可以省略花括弧 182
6.4.2省略花括弧的危險 183
6.5for循環的陷阱 185
6.5.1分號惹的禍 185
6.5.2小心循環計數器的值 188
6.5.3浮點數作循環計數器 188
6.6foreach循環的循環計數器 190
6.7本章小結 192
第7章面向對象的陷阱 193
7.1instanceof運算符的陷阱 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.7static關鍵字 215
7.7.1靜態方法屬於類 215
7.7.2靜態內部類的限制 217
7.8native方法的陷阱 217
7.9本章小結 219
第8章異常處理的陷阱 220
8.1正確關閉資源的方式 221
8.1.1傳統關閉資源的方式 221
8.1.2使用Java 7增強的try語句關閉資源 224
8.2finally塊的陷阱 226
8.2.1finally的執行規則 226
8.2.2finally塊和方法返回值 227
8.3catch塊的用法 229
8.3.1catch塊的順序 229
8.3.2不要用catch代替流程控制 231
8.3.3隻有catch可能拋出的異常 232
8.3.4做點實際的修復 235
8.4繼承得到的異常 237
8.5Java 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.5Java集合中的棧 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.6Java集合中的佇列 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.3Shell排序 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.2IDE工具概述 423
15.2.1IDE工具的基本功能 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.3JUnit介紹 461
16.2.4JUnit的用法 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