圖書簡介
這是一本既注重實戰,同時也注重底層“內功”(記憶體分析、JVM底層、數據結構)訓練的書,本書能幫 助初學者打通Java編程“任督二脈”。本書集作者11年Java教學之精華,既適合初學者入門,也適合已經工作 的開發者複習。 全書共分18章,內容涵蓋Java開發所需的相關內容及339個案例(很多案例對於工作人員也有很大的參 考價值)。書中秉承尚學堂實戰化教學理念,從第一章開始介入實戰項目,寓教於樂,讀者可迅速進入開發 者的角色。 本書適合初學者入門,也適合高等院校相關專業作為教材使用,還可作為
Java程式設計師的參考用書。
圖書目錄
第1章 Java入門 1
1.1 計算機語言發展史及未來方向 1
1.1.1 計算機已經成為人類大腦的延伸 1
1.1.2 算法是計算機的“靈魂”,
程式語言是塑造計算機“靈魂”
的工具 2
1.1.3 為什麼擔心軟體開發人才飽和是
多餘的 3
1.1.4 未來30年必將是軟體人才的世界 3
1.2 常用的程式語言 4
1.3 Java語言介紹 6
1.3.1 Java發展簡史 6
1.3.2 Java的核心優勢 6
1.3.3 Java各版本的含義 7
1.3.4 Java的特性 7
1.3.5 Java應用程式的運行機制 9
1.3.6 JVM、JRE和JDK 9
1.4 Java開發環境搭建 10
1.4.1 JDK的下載和安裝 10
1.4.2 環境變數Path的配置 12
1.4.3 JDK安裝測試 13
1.5 建立和運行第一個Java程式 13
1.5.1 建立第一個Java程式 13
1.5.2 編譯第一個程式時的常見錯誤 15
1.5.3 總結第一個Java程式 15
1.5.4 最常用的DOS命令 16
1.6 常用的Java開發工具 16
1.7 Eclipse使用10分鐘入門 17
1.7.1 下載和安裝Eclipse 17
1.7.2 在Eclipse中創建Java項目 18
1.7.3 使用Eclipse開發和運行Java
程式 20
1.8 30分鐘完成桌球小遊戲項目 22
本章總結 28
本章作業 28
第2章數據類型和運算符 30
2.1 注釋 30
2.2 標識符 31
2.3 Java中的關鍵字/保留字 32
2.4 變數 32
2.4.1 變數的本質 32
2.4.2 變數的分類 33
2.5 常量 35
2.6 基本數據類型 36
2.6.1 整型 36
2.6.2 浮點型 37
2.6.3 字元型 39
目 錄
實戰Java
程式設計
VI 實戰Java程式設計
2.6.4 布爾型 40
2.7 運算符 40
2.7.2 賦值及其擴展賦值運算符 41
2.7.5 位運算符 43
2.7.6 字元串連線符 43
2.7.8 運算符優先權問題 44
2.8 數據類型的轉換 44
2.8.3 基本類型轉換時的常見錯誤和
問題 46
2.9 簡單的鍵盤輸入和輸出 46
本章總結 47
本章作業 48
第3章控制語句 50
3.1 條件判斷結構 50
3.1.1 if單分支結構 51
3.1.2 if-else雙分支結構 52
3.1.3 if-else if-else多分支結構 54
3.1.4 switch多分支結構 55
3.2 循環結構 57
3.2.1 while循環 57
3.2.2 do-while循環58
3.2.3 for循環 59
3.2.4 嵌套循環 62
3.2.6 帶標籤的break語句和continue
語句 64
3.3 語句塊 65
3.4 方法 65
3.5 方法的重載 67
3.6 遞歸結構 68
本章總結 70
本章作業 71
第4章 Java面向對象編程基礎 74
4.1 面向過程和面向對象思想 74
4.2 對象的進化史 75
4.3 對象和類的概念 77
4.4 類和對象初步 77
4.4.1 第一個類的定義 78
4.4.2 屬性(field成員變數) 78
4.4.3 方法 79
4.4.4 一個典型類的定義和UML圖 79
4.5 面向對象的記憶體分析 80
4.6 對象的使用及記憶體分析 81
4.7 構造器 82
4.8 構造器的重載 83
4.9 垃圾回收機制 84
4.9.1 垃圾回收的原理和算法 84
4.9.2 通用的分代垃圾回收機制 85
4.9.3 JVM調優和Full GC 86
4.9.4 開發中容易造成記憶體泄露的
操作 86
4.11 static關鍵字 89
4.12 靜態初始化塊 90
4.13 參數傳值機制 91
4.14 包 92
4.14.1 package 92
4.14.2 JDK中的常用包 92
4.14.3 導入類 93
4.14.4 靜態導入 94
本章總結 94
本章作業 95
第5章 Java面向對象編程進階 97
5.1 繼承 97
5.1.1 繼承的實現 97
5.1.2 instanceof運算符 98
5.1.3 繼承的使用要點 99
5.1.4 方法的重寫 99
5.2 Object類100
VII 目 錄
5.2.1 Object類的基本特性 100
5.2.2 toString方法 101
5.2.3 ==和equals方法102
5.3 super關鍵字 103
5.4 封裝 104
5.4.1 封裝的作用和含義 104
5.4.2 封裝的實現——使用訪問
控制符 106
5.4.3 封裝的使用細節 109
5.5 多態 110
5.6 對象的轉型112
5.7 final關鍵字113
5.8 抽象方法和抽象類 114
5.9 接口interface 115
5.9.1 接口的作用 115
5.9.2 定義和使用接口 116
5.9.3 接口的多繼承 117
5.10 內部類 119
5.10.1 內部類的概念 119
5.10.2 內部類的分類 120
5.11 字元串String 123
5.11.1 String基礎 124
5.11.2 String類和常量池 124
5.11.3 閱讀API文檔 125
5.11.4 String類的常用方法 127
5.11.5 字元串相等的判斷 129
5.12 設計模式相關知識 130
5.12.1 開閉原則 130
5.12.2 相關設計模式 130
本章總結 130
本章作業 132
第6章異常機制 136
6.1 導引問題 136
6.2 異常的概念 137
6.3 異常的分類 138
6.3.1 Error 138
6.3.2 Exception139
6.3.3 RuntimeException——運行時
異常 139
6.3.4 CheckedException——已檢查
異常 143
6.4 異常的處理方式之一:捕獲異常 143
6.5 異常的處理方式之二:聲明異常
(throws子句) 145
6.6 自定義異常 146
6.7 如何利用百度解決異常問題 148
本章總結 148
本章作業 149
第7章數組 151
7.1 數組概述 151
7.2 創建數組和初始化 151
7.2.1 數組聲明 151
7.2.2 初始化 153
7.3 常用數組操作 154
7.3.1 數組的遍歷 154
7.3.2 for-each 循環 155
7.3.3 數組的複製 155
7.3.4 java.util.Arrays類 156
7.4 多維數組 158
7.5 用數組存儲表格數據 160
7.6 冒泡排序算法 161
7.6.1 冒泡排序的基礎算法 161
7.6.2 冒泡排序的最佳化算法 162
7.7 二分法檢索 163
本章總結 165
本章作業 166
第8章常用類 168
8.1 基本數據類型的包裝類 168
8.1.1 包裝類的基本知識 168
8.1.2 包裝類的用途 169
8.1.3 自動裝箱和拆箱 170
8.1.4 包裝類的快取問題 172
VIII 實戰Java程式設計
8.2 字元串相關類 174
8.2.1 String類 174
8.2.2 StringBuffer 和StringBuilder 176
8.2.3 不可變和可變字元序列使用
陷阱 178
8.3 時間處理相關類 179
8.3.1 Date時間類(java.util.Date) 179
8.3.2 DateFormat類和
SimpleDateFormat類 181
8.3.3 Calendar日曆類 183
8.4 Math類186
8.5 File類 188
8.5.1 File類的基本用法 188
8.5.2 遞歸遍歷目錄結構和樹狀展現 191
8.6 枚舉 192
本章總結 194
本章作業 194
第9章容器 197
9.1 泛型 198
9.1.1 自定義泛型 198
9.1.2 容器中使用泛型 198
9.3 List接口 200
9.3.1 List特點和常用方法 200
9.3.2 ArrayList的特點和底層實現 203
9.3.3 LinkedList的特點和底層實現 204
9.3.4 Vector 向量 205
9.4.1 HashMap和HashTable 206
9.4.2 HashMap底層實現詳解 207
9.4.3 二叉樹和紅黑二叉樹 212
9.4.4 TreeMap 的使用和底層實現 215
9.5 Set接口 215
9.5.1 HashSet的基本套用 215
9.5.2 HashSet的底層實現 216
9.5.3 TreeSet 的使用和底層實現 217
9.6 Iterator接口 218
9.6.1 疊代器介紹 218
9.6.2 使用Iterator疊代器遍歷容器元素
(List/Set/Map) 218
9.7 遍歷集合的方法總結 220
9.8 Collections工具類 221
本章總結 222
本章作業 223
第10章輸入與輸出技術 226
10.1 基本概念和I/O入門 227
10.1.1 數據源 227
10.1.2 流的概念 227
10.1.3 第一個簡單的I/O流應用程式 228
10.1.4 Java中流的概念細分 230
10.1.5 Java中I/O流類的體系 231
10.1.6 四大I/O抽象類 232
10.2 常用流詳解 233
10.2.1 檔案位元組流 233
10.2.2 檔案字元流 235
10.2.3 緩衝位元組流 237
10.2.4 緩衝字元流 239
10.2.5 位元組數組流 241
10.2.6 數據流 242
10.2.7 對象流 244
10.2.8 轉換流 246
10.2.9 隨意訪問檔案流 248
10.3 Java對象的序列化和反序列化 249
10.3.1 序列化和反序列化是什麼 249
10.3.2 序列化涉及的類和接口 250
10.3.3 序列化與反序列化的步驟和
實例 250
10.4 裝飾器模式構建I/O流體系 252
10.4.1 裝飾器模式簡介 252
10.4.2 I/O流體系中的裝飾器模式 253
10.5 Apache IOUtils和FileUtils的
使用 253
10.5.1 Apache基金會介紹 254
10.5.2 FileUtils的妙用 254
10.5.3 IOUtils的妙用 258
IX 目 錄
本章總結 259
本章作業 260
11.1 基本概念 262
11.1.1 程式 262
11.1.2 進程 262
11.1.3 執行緒 263
11.1.4 執行緒和進程的區別 264
11.1.5 進程與程式的區別 264
11.2 Java中如何實現多執行緒 264
11.2.1 通過繼承Thread類實現多執行緒265
11.2.2 通過Runnable接口實現多執行緒266
11.3 執行緒狀態和生命周期 266
11.3.1 執行緒狀態 266
11.3.2 終止執行緒的典型方式 267
11.3.3 暫停執行緒執行的常用方法 269
11.3.4 聯合執行緒的方法 270
11.4 執行緒的基本信息和優先權別 272
11.4.1 獲取執行緒基本信息的方法 272
11.4.2 執行緒的優先權 273
11.5 執行緒同步 274
11.5.1 什麼是執行緒同步 274
11.5.2 實現執行緒同步 275
11.5.3 死鎖及解決方案 277
11.6 執行緒並發協作(生產者-消費者模式) 280
11.7 任務定時調度 284
本章總結 285
本章作業 286
第12章網路編程 289
12.1 基本概念 289
12.1.1 計算機網路 289
12.1.2 網路通信協定 290
12.1.3 數據封裝與解封 291
12.1.4 IP位址與連線埠 293
12.1.5 URL 294
12.1.6 Socket 294
12.2 Java網路編程中的常用類 295
12.2.1 InetAddress 296
12.2.2 InetSocketAddress297
12.2.3 URL類 297
12.3 TCP通信的實現 298
12.4 UDP通信的實現 308
本章總結 313
本章作業 314
第13章 J20飛機遊戲項目 316
13.1 簡介 316
13.2 遊戲項目基本功能的開發 316
13.2.1 使用AWT 技術畫出遊戲主視窗
(0.1版) 317
13.2.2 圖形和文本繪製(0.2版) 319
13.2.3 ImageIO實現圖片載入技術
(0.3版) 319
13.2.4 多執行緒和內部類實現動畫
效果(0.4版) 321
13.2.5 雙緩衝技術解決閃爍問題
(0.4) 324
13.2.6 GameObject類設計(0.5版)325
13.3 飛機類設計(0.6版) 327
13.3.1 鍵盤控制原理 328
13.3.2 飛機類:增加操控功能 328
13.3.3 主視窗類:增加鍵盤監聽 329
13.4 炮彈類設計(0.7版) 330
13.4.1 炮彈類的基本設計 330
13.4.2 炮彈任意角度飛行路徑 331
13.4.3 容器對象存儲多發炮彈 331
13.5 碰撞檢測技術(0.8版) 332
13.5.1 矩形檢測原理 333
13.5.2 炮彈和飛機碰撞檢測 333
13.6 爆炸效果的實現(0.9版) 334
13.6.1 爆炸類的基本設計 335
13.6.2 主視窗類創建爆炸對象 335
13.7 其他功能(1.0版) 337
13.7.1 計時功能 337
X 實戰Java程式設計
和說明 338
第14章 GUI編程——Swing基礎 341
14.1 AWT 簡介 342
14.2 Swing簡介 342
14.2.1 javax.swing.JFrame 343
14.2.2 javax.swing.JPanel 347
14.2.3 常用基本控制項 349
14.2.4 布局管理器 352
本章總結 357
本章作業 358
第15章事件模型 359
15.1 事件模型簡介及常用事件類型 359
15.1.1 事件控制的過程 359
15.1.2 ActionEvent事件 361
15.1.3 MouseEvent事件364
15.1.4 KeyEvent事件 366
15.1.5 WindowEvent 事件 366
15.2 事件處理的實現方式 367
15.2.1 使用內部類實現事件處理 367
15.2.2 使用適配器實現事件處理 369
15.2.3 使用匿名內部類實現事件
處理 372
本章總結 380
本章作業 380
第16章 Swing中的其他控制項 382
16.1 單選按鈕控制項(JRadioButton) 382
16.2 複選框控制項(JCheckBox)385
16.3 下拉列表控制項(JComboBox) 386
16.4 表格控制項(JTable) 389
16.4.1 JTable 的簡單套用 390
16.4.2 DefaultTableModel 393
16.5 用戶註冊案例 396
本章總結 402
本章作業 402
第17章反射機制 404
17.1 動態語言 404
17.2 反射機制的本質和Class類 404
17.2.1 反射機制的本質 405
17.2.2 java.lang.Class類406
17.3 反射機制的常見操作 407
17.3.1 操作構造器(Constructor類) 408
17.3.2 操作屬性(Field類) 409
17.3.3 操作方法(Method類) 410
17.4 反射機制的效率問題411
本章總結 412
本章作業 412
第18章核心設計模式 415
18.1 GoF 23設計模式簡介 415
18.2 單例模式 416
18.2.1 餓漢式 417
18.2.2 懶漢式 417
18.2.3 靜態內部類式 418
18.2.4 枚舉式單例 419
18.2.5 四種單例創建模式的選擇 419
18.3 工廠模式 420
18.4 裝飾模式 422
18.6 模板方法模式(鉤子方法) 429
18.8 代理模式(動態) 433
本章總結 437
本章作業 438
附錄Java 300集大型教學視頻
目錄 440
實戰Java
程式設計
案例目錄
第1章 Java入門
【示例1-1】使用記事本開發第一個Java程式 13
【示例1-2】使用Eclipse開發Java程式 21
【示例1-3】桌球遊戲代碼——繪製視窗 23
【示例1-4】桌球遊戲代碼——載入圖片 24
【示例1-5】桌球遊戲代碼——實現水平方向來回
飛行 26
【示例1-6】桌球遊戲代碼——實現任意角度
飛行 27
第2章 數據類型和運算符
【示例2-1】認識Java的三種注釋類型 31
【示例2-2】合法的標識符 31
【示例2-3】不合法的標識符 31
【示例2-4】聲明變數 33
【示例2-5】在一行中聲明多個變數 33
【示例2-6】在聲明變數的同時完成變數的初始化 33
【示例2-7】局部變數的聲明 34
【示例2-8】實例變數的聲明 34
【示例2-9】常量的聲明及使用 35
【示例2-10】long類型常數的寫法及變數的
聲明 37
賦值 37
【示例2-12】float類型常量的寫法及變數的聲明 37
【示例2-13】浮點型數據的比較一 38
【示例2-14】浮點型數據的比較二 38
【示例2-15】使用BigDecimal進行浮點型數據的
比較 38
【示例2-16】字元型演示 39
【示例2-17】字元型的十六進制值表示
方法 39
【示例2-18】轉義字元 39
【示例2-19】boolean類型演示 40
【示例2-20】一元運算符++與-- 41
【示例2-21】擴展運算符 41
【示例2-22】短路與和邏輯與 42
【示例2-23】左移運算和右移運算 43
【示例2-24】連線符“+” 43
【示例2-25】三目條件運算符 44
【示例2-26】自動類型轉換特例 45
【示例2-27】強制類型轉換 45
【示例2-28】強制類型轉換特例 46
【示例2-29】類型轉換常見問題一 46
【示例2-30】類型轉換常見問題二 46
【示例2-31】使用Scanner獲取鍵盤輸入 46
第3章 控制語句
【示例3-1】if單分支結構 51
【示例3-2】if-else雙分支結構 52
第6章異常機制
【示例6-1】偽代碼——使用if處理程式中可能
出現的各種情況 136
【示例6-2】異常的分析 137
【示例6-3】ArithmeticException異常——試圖
除以0 139
【示例6-4】NullPointerException異常 140
【示例6-5】ClassCastException異常 141
【示例6-6】ArrayIndexOutOfBoundsException
異常 141
【示例6-7】NumberFormatException異常 142
【示例6-8】異常處理的典型代碼(捕獲異常) 145
【示例6-9】異常處理的典型代碼(聲明異常拋出throws) 146
【示例6-10】自定義異常類 147
【示例6-11 】自定義異常類的使用 147
第7章數組
【示例7-1】數組的聲明方式(以一維數組為例) 151
【示例7-2】創建基本類型一維數組 152
【示例7-3】創建引用類型一維數組 152
【示例7-4】數組的靜態初始化 153
【示例7-5】數組的動態初始化 153
【示例7-6】數組的默認初始化 154
【示例7-7】使用循環初始化和遍歷數組 154
【示例7-8】使用增強for循環遍歷數組155
【示例7-9】數組的複製 155
【示例7-10】使用Arrays類輸出數組中的元素 156
【示例7-11 】使用Arrays類對數組元素進行排序一 156
【示例7-12】使用Arrays類對數組元素進行排序二(Comparable接口的套用)157
【示例7-13】使用Arrays類實現二分法查找法 158
【示例7-14】使用Arrays類對數組進行填充 158
【示例7-15】二維數組的聲明 159
【示例7-16】二維數組的靜態初始化 159
【示例7-17】二維數組的動態初始化 159
【示例7-18】獲取數組長度 160
【示例7-19】使用二維數組保存表格數據 161
【示例7-20】冒泡排序的基礎算法 162
【示例7-21】冒泡排序的最佳化算法 163
【示例7-22】二分法檢索的基本算法 164
第8章常用類
【示例8-1】初識包裝類 169
【示例8-2】包裝類的使用 170
【示例8-3】自動裝箱 171
【示例8-4】自動拆箱 171
【示例8-5】包裝類空指針異常問題 171
【示例8-6】自動裝箱與拆箱 172
【示例8-7】Integer類相關源碼172
【示例8-8】IntegerCache類相關源碼173
【示例8-9】包裝類的快取測試 173
【示例8-10】String類的簡單使用 175
【示例8-11 】
字元串常量拼接時的最佳化 175
【示例8-12】AbstractStringBuilder 部分源碼176
【示例8-13】StringBuffer/StringBuilder 基本用法177
【示例8-14】String和StringBuilder在字元串頻繁修改時的效率測試 178
【示例8-15】Date類的使用180
【示例8-16】DateFormat類和SimpleDateFormat類的使用 181
【示例8-17】時間格式字元的使用 182
【示例8-18】GregorianCalendar類和Calendar類的使用 183
【示例8-19】可視化日曆的編寫 184
【示例8-20】Math類的常用方法186
【示例8-21】Random類的常用方法187
【示例8-22】使用File類創建檔案188
【示例8-23】使用File類訪問檔案或目錄屬性189
【示例8-24】使用mkdir創建目錄189
【示例8-25】使用mkdirs創建目錄 190
【示例8-26】File類的綜合套用190
【示例8-27】使用遞歸算法,以樹狀結構展示目錄樹 191
【示例8-28】創建枚舉類型 193
【示例8-29】枚舉的使用 193
第9章容器
【示例9-1】泛型的聲明 198
【示例9-2】泛型的套用 198
【示例9-3】泛型在集合中的使用 199
【示例9-4】List的常用方法201
【示例9-5】兩個List之間的元素處理201
【示例9-6】List中操作索引的常用方法202
【示例9-7】Map接口中的常用方法206
【示例9-9】HashSet的使用216
【示例9-10】TreeSet 和Comparable接口的使用 217
【示例9-11 】疊代器遍歷List 218
【示例9-12】疊代器遍歷Set 219
【示例9-13】疊代器遍歷Map(一)219
【示例9-14】疊代器遍歷Map(二)220
【示例9-15】遍歷List方法一——普通for循環 220
【示例9-16】遍歷List方法二——增強for循環
(使用泛型) 221
【示例9-17】遍歷List方法三——使用Iterator
疊代器(1) 221
【示例9-18】遍歷List方法四——使用Iterator
疊代器(2) 221
【示例9-19】遍歷Set方法一——增強for循環 221
【示例9-20】遍歷Set方法二——使用Iterator
疊代器 221
【示例9-21】遍歷Map方法一——根據key獲取
value 221
【示例9-22】遍歷Map方法二——使用entrySet221
【示例9-23】Collections工具類的常用方法 222
第10章輸入與輸出技術
【示例10-1】使用流讀取檔案內容(不規範的寫法,僅用於測試) 228
【示例10-2】使用流讀取檔案內容(經典代碼,一定要掌握) 229
【示例10-3】將檔案內容讀取到程式中 233
【示例10-4】將字元串/位元組數組的內容寫入到
檔案中 233
【示例10-5】利用檔案流實現檔案的複製 234
【示例10-6】使用FileReader與FileWriter 實現
文本檔案的複製 236
【示例10-7】使用緩衝流實現檔案的高效率
複製 237
【示例10-8】使用BufferedReader 與BufferedWriter
實現文本檔案的複製 239
【示例10-9】簡單測試ByteArrayInputStream 的
使用 241
【示例10-10】DataInputStream和DataOutputStream
的使用 242
【示例10-11 】ObjectInputStream和ObjectOutputStream
的使用 244
【示例10-12】使用InputStreamReader接收用戶的
輸入,並輸出到控制台 247
【示例10-13】RandomAccessFile的套用 248
【示例10-14】將Person類的實例進行序列化
和反序列化 250
【示例10-15】裝飾器模式演示 252
【示例10-16】讀取檔案內容,並輸出到控制台上
(只需一行代碼) 256
【示例10-17】複製目錄,並使用FileFilter過濾
目錄和以html結尾的檔案257
【示例10-18】IOUtils的方法 258
第11章多執行緒技術
【示例11-1 】通過繼承Thread類實現多執行緒 265
【示例11-2 】通過Runnable接口實現多執行緒 266
【示例11-3 】終止執行緒的典型方法(重要) 268
【示例11-4 】暫停執行緒的方法——sleep 269
【示例11-5 】暫停執行緒的方法——yield 269
【示例11-6 】執行緒的聯合-join 270
【示例11-7 】執行緒的常用方法一 272
【示例11-8 】執行緒的常用方法二 273
【示例11-9 】多執行緒操作同一個對象(未使用執行緒同步) 274
【示例11-10 】多執行緒操作同一個對象(使用執行緒同步) 276
【示例11-11 】死鎖問題演示278
【示例11-12 】死鎖問題的解決 279
【示例11-13 】生產者與消費者模式 281
【示例18-11 】責任鏈模式典型用法——抽象
處理者 427
【示例18-12】責任鏈模式典型用法——具體
處理者 427
【示例18-13】責任鏈模式的調用 429
【示例18-14】模板方法模式典型用法 430
【示例18-15】定義子類或者匿名內部類實現
調用模板方法 430
【示例18-16】觀察者模式典型用法——目標
對象 432
【示例18-17】觀察者模式典型用法——觀察者 432
【示例18-18】觀察者模式的調用 432
【示例18-19】動態代理模式的典型用法——定義
統一接口 435
【示例18-20】動態代理模式的典型用法——真正
的明星類 435
【示例18-21】動態代理模式的典型用法——機制435
【示例18-22】動態代理模式的調用 436