人民幣定價:59 元
定價
:NT$ 354 元優惠價
:
87 折 308 元
絕版無法訂購
商品簡介
作者簡介
目次
書摘/試閱
商品簡介
本書歸納了Java學習者、工作者在學習、工作過程中最欠缺的技術短板,本書把Java編程中的重點、要點、難點、常見陷阱收集在一起,旨在幫助讀者重點突破這些看似“司空見慣”的基本功。 本書知識主要分為四個部分,第一部分主要介紹Java程序的內存管理,這部分是大多Java程序員最容易忽略的地方——因為Java不像C,而且Java提供了垃圾回收機制,因此導致許多Java程序員對內存管理重視不夠;第二部分主要介紹了Java編程過程中各種常見的陷阱,這些陷阱有些來自于李剛老師早年痛苦的經歷,有些來自於他的眾多學子的痛苦經歷,都是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體系圖書都是已經得到廣泛的市場認同,並多次重印的暢銷圖書,並被多家高校選作教材,部分圖書已被翻譯成繁體中文版、輸出到臺灣地區。
瘋狂Java實訓營創始人,瘋狂Java體系圖書作者。曾任LITEON公司的J2EE技術主管,負責該公司的企業信息化平臺的架構設計。
曾任廣州電信、廣東龍泉科技等公司的技術培訓導師。曾兼任廣東技術師範學院計算機科學系的兼職副教授。
2007年3月26日的《電腦報》專訪人物。
培訓的學生已在華為、立信、普信、網易、電信盈科等公司就職。
國內著名的高端IT技術作家,已出版《瘋狂Java講義》、《瘋狂Android講義》、《輕量級Java EE企業應用實戰》、《瘋狂Ajax講義》、《瘋狂XML講義》、《經典Java EE企業應用實戰》、《Struts 2.1權威指南》、《Ruby On Rails敏捷開發最佳實踐》等著作。其中瘋狂Java體系圖書都是已經得到廣泛的市場認同,並多次重印的暢銷圖書,並被多家高校選作教材,部分圖書已被翻譯成繁體中文版、輸出到臺灣地區。
目次
第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
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
書摘/試閱
如何學習Java
——謹以此文獻給打算以編程為職業、並願意為之瘋狂的人
經常看到有些學生、求職者捧著一本類似JBuilder入門、Eclipse指南之類的圖書學習Java,當他們學會了在這些工具中拖出窗體、安裝按鈕之後,就覺得自己掌握,甚至精通了 Java;又或是找來一本類似JSP動態網站編程之類的圖書,學會使用JSP腳本編寫一些頁面後,就自我感覺掌握了Java開發。
還有一些學生、求職者聽說J2EE、Spring或EJB很有前途,於是立即跑到書店或圖書館找來一本相關圖書。希望立即學會它們,然後進入軟件開發業、大顯身手。
還有一些學生、求職者非常希望找到一本既速成、又大而全的圖書,比如突擊J2EE開發、一本書精通J2EE之類的圖書(包括筆者曾出版的《輕量級J2EE企業應用實戰》一書,據說銷量不錯),希望這樣一本圖書就可以打通自己的“任督二脈”,一躍成為J2EE開發高手。
也有些學生、求職者非常喜歡J2EE項目實戰、項目大全之類的圖書,他們的想法很單純:我按照書上介紹,按圖索驥、依葫蘆畫瓢,應該很快就可學會J2EE,很快就能成為一個受人羡慕的J2EE程序員了。
……
凡此種種,不一而足。但最後的結果往往是失敗,因為這種學習沒有積累、沒有根基,學習過程中困難重重,每天都被一些相同、類似的問題所困擾,起初熱情十足,經常上論壇詢問,按別人的說法解決問題之後很高興,既不知道為什麼錯?也不知道為什麼對?只是盲目地抄襲別人的說法。最後的結果有兩種:
久而久之,熱情喪失,最後放棄學習。
大部分常見問題都問遍了,最後也可以從事一些重複性開發,但一旦遇到新問題,又將束手無策。
第二種情形在普通程序員中占了極大的比例,筆者多次聽到、看到(在網絡上)有些程序員抱怨:我做了2年多Java程序員了,工資還是3000多點。偶爾筆者會與他們聊聊工作相關內容,他們會告訴筆者:我也用Spring了啊,我也用EJB了啊……他們感到非常不平衡,為什麼我的工資這麼低?其實筆者很想告訴他們:你們太浮躁了!你們確實是用了Spring、Hibernate又或是EJB,但你們未想過為什麼要用這些技術?用這些技術有什麼好處?如果不用這些技術行不行?
很多時候,我們的程序員把Java當成一種腳本,而不是一門面向對象的語言。他們習慣了在JSP腳本中使用Java,但從不去想JSP如何運行,Web服務器裡的網絡通信、多線層機制,為何一個JSP頁面能同時向多個請求者提供服務?更不會想如何開發Web服務器;他們像代碼機器一樣編寫Spring Bean代碼,但從不去理解Spring容器的作用,更不會想如何開發Spring容器。
有時候,筆者的學生在編寫五子棋、梭哈等作業感到困難時,會向他們的大學師兄、朋友求救,這些程序員告訴他:不用寫了,網上有下載的!聽到這樣回答,筆者不禁感到啞然:網上還有Windows下載呢!網上下載和自己編寫是兩碼事。偶爾,筆者會懷念以前黑色屏幕、綠熒熒字符時代,那時候程序員很單純:當我們想偷懶時,習慣思維是寫一個小工具;現在程序員很聰明:當他們想偷懶時,習慣思維是從網上下一個小工具。但是,誰更幸福?
當筆者的學生把他們完成的小作業放上互聯網之後,然後就有許多人稱他們為“高手”!這個稱呼卻讓他們萬分慚愧;慚愧之餘,他們也感到萬分欣喜,非常有成就感,這就是編程的快樂。編程的過程,與尋寶的過程完全一樣:歷經辛苦,終於找到心中的夢想,這是何等的快樂?
如果真的打算將編程當成職業,那就不應該如此浮躁,而是應該扎扎實實先學好Java語言,然後按Java本身的學習規律,踏踏實實一步一個腳印地學習,把基本功練扎實了才可獲得更大的成功。
實際情況是,有多少程序員真正掌握了Java的面向對象?真正掌握了Java的多線程、網絡通信、反射等內容?有多少Java程序員真正理解了類初始化時內存運行過程?又有多少程序員理解Java對象從創建到消失的全部細節?有幾個程序員真正獨立地編寫過五子棋、梭哈、桌面彈球這種小遊戲?又有幾個Java程序員敢說:我可以開發Struts?我可以開發Spring?我可以開發Tomcat?很多人又會說:這些都是許多人開發出來的!實際情況是:許多開源框架的核心最初完全是由一個人開發的。現在這些優秀程序已經出來了!你,是否深入研究過它們,是否深入掌握了它們?
如果要真正掌握Java,包括後期的Java EE相關技術(例如Struts、Spring、Hibernate和EJB等),一定要記住筆者的話:絕不要從IDE(如JBuilder、Eclipse和NetBeans)工具開始學習!IDE工具的功能很強大,初學者學起來也很容易上手,但也非常危險:因為IDE工具已經為我們做了許多事情,而軟件開發者要全部瞭解軟件開發的全部步驟。
2012年12月1日
——謹以此文獻給打算以編程為職業、並願意為之瘋狂的人
經常看到有些學生、求職者捧著一本類似JBuilder入門、Eclipse指南之類的圖書學習Java,當他們學會了在這些工具中拖出窗體、安裝按鈕之後,就覺得自己掌握,甚至精通了 Java;又或是找來一本類似JSP動態網站編程之類的圖書,學會使用JSP腳本編寫一些頁面後,就自我感覺掌握了Java開發。
還有一些學生、求職者聽說J2EE、Spring或EJB很有前途,於是立即跑到書店或圖書館找來一本相關圖書。希望立即學會它們,然後進入軟件開發業、大顯身手。
還有一些學生、求職者非常希望找到一本既速成、又大而全的圖書,比如突擊J2EE開發、一本書精通J2EE之類的圖書(包括筆者曾出版的《輕量級J2EE企業應用實戰》一書,據說銷量不錯),希望這樣一本圖書就可以打通自己的“任督二脈”,一躍成為J2EE開發高手。
也有些學生、求職者非常喜歡J2EE項目實戰、項目大全之類的圖書,他們的想法很單純:我按照書上介紹,按圖索驥、依葫蘆畫瓢,應該很快就可學會J2EE,很快就能成為一個受人羡慕的J2EE程序員了。
……
凡此種種,不一而足。但最後的結果往往是失敗,因為這種學習沒有積累、沒有根基,學習過程中困難重重,每天都被一些相同、類似的問題所困擾,起初熱情十足,經常上論壇詢問,按別人的說法解決問題之後很高興,既不知道為什麼錯?也不知道為什麼對?只是盲目地抄襲別人的說法。最後的結果有兩種:
久而久之,熱情喪失,最後放棄學習。
大部分常見問題都問遍了,最後也可以從事一些重複性開發,但一旦遇到新問題,又將束手無策。
第二種情形在普通程序員中占了極大的比例,筆者多次聽到、看到(在網絡上)有些程序員抱怨:我做了2年多Java程序員了,工資還是3000多點。偶爾筆者會與他們聊聊工作相關內容,他們會告訴筆者:我也用Spring了啊,我也用EJB了啊……他們感到非常不平衡,為什麼我的工資這麼低?其實筆者很想告訴他們:你們太浮躁了!你們確實是用了Spring、Hibernate又或是EJB,但你們未想過為什麼要用這些技術?用這些技術有什麼好處?如果不用這些技術行不行?
很多時候,我們的程序員把Java當成一種腳本,而不是一門面向對象的語言。他們習慣了在JSP腳本中使用Java,但從不去想JSP如何運行,Web服務器裡的網絡通信、多線層機制,為何一個JSP頁面能同時向多個請求者提供服務?更不會想如何開發Web服務器;他們像代碼機器一樣編寫Spring Bean代碼,但從不去理解Spring容器的作用,更不會想如何開發Spring容器。
有時候,筆者的學生在編寫五子棋、梭哈等作業感到困難時,會向他們的大學師兄、朋友求救,這些程序員告訴他:不用寫了,網上有下載的!聽到這樣回答,筆者不禁感到啞然:網上還有Windows下載呢!網上下載和自己編寫是兩碼事。偶爾,筆者會懷念以前黑色屏幕、綠熒熒字符時代,那時候程序員很單純:當我們想偷懶時,習慣思維是寫一個小工具;現在程序員很聰明:當他們想偷懶時,習慣思維是從網上下一個小工具。但是,誰更幸福?
當筆者的學生把他們完成的小作業放上互聯網之後,然後就有許多人稱他們為“高手”!這個稱呼卻讓他們萬分慚愧;慚愧之餘,他們也感到萬分欣喜,非常有成就感,這就是編程的快樂。編程的過程,與尋寶的過程完全一樣:歷經辛苦,終於找到心中的夢想,這是何等的快樂?
如果真的打算將編程當成職業,那就不應該如此浮躁,而是應該扎扎實實先學好Java語言,然後按Java本身的學習規律,踏踏實實一步一個腳印地學習,把基本功練扎實了才可獲得更大的成功。
實際情況是,有多少程序員真正掌握了Java的面向對象?真正掌握了Java的多線程、網絡通信、反射等內容?有多少Java程序員真正理解了類初始化時內存運行過程?又有多少程序員理解Java對象從創建到消失的全部細節?有幾個程序員真正獨立地編寫過五子棋、梭哈、桌面彈球這種小遊戲?又有幾個Java程序員敢說:我可以開發Struts?我可以開發Spring?我可以開發Tomcat?很多人又會說:這些都是許多人開發出來的!實際情況是:許多開源框架的核心最初完全是由一個人開發的。現在這些優秀程序已經出來了!你,是否深入研究過它們,是否深入掌握了它們?
如果要真正掌握Java,包括後期的Java EE相關技術(例如Struts、Spring、Hibernate和EJB等),一定要記住筆者的話:絕不要從IDE(如JBuilder、Eclipse和NetBeans)工具開始學習!IDE工具的功能很強大,初學者學起來也很容易上手,但也非常危險:因為IDE工具已經為我們做了許多事情,而軟件開發者要全部瞭解軟件開發的全部步驟。
2012年12月1日
主題書展
更多
主題書展
更多書展購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

