作者簡介
林信良(網名:良葛格),畢業於
台灣大學電機工程學系。擅長技術寫作、翻譯與教育培訓。喜好研究程式語言、框架、社群,從中學習設計、典範及文化,並利用閒暇之餘記錄所學技術,涵蓋C/C++、Java、Ruby/Rails、Python、JavaScript、Haskell、OpenSCAD等領域。目前出版的著作有《JSP & Servlet學習筆記(第2版)》《Spring技術手冊》《Java JDK 8 學習筆記》等,譯作有《Ajax實戰手冊》《jQuery實戰手冊(第2版)》。
內容簡介
《Java JDK 9學習筆記》是作者多年來教學實踐經驗的總結,匯集了學員在學習Java 或認證考試時遇到的概念、操作、套用等問題及解決方案。《Java JDK 9學習筆記》針對Java SE 9 新功能全面改版,無論是章節架構或範例程式代碼,都做了重新編寫與全面翻新,並詳細介紹了Java 9 的模組化,JVM、JRE、Java SE API、JDK 與IDE 之間的對照關係。必要時可從Java SE API 的原始碼分析,了解各種語法在Java SE API 中如何套用。對於建議練習的範例提供了Lab 文檔,以突出練習重點。此外,《Java JDK 9學習筆記》還將IDE 操作納為教學內容之一,讓讀者能與實踐相結合,輕鬆快速掌握Java 編程技巧。《Java JDK 9學習筆記》適合Java 的初、中級讀者以及廣大Java 套用開發人員閱讀。
目錄
Chapter 1 Java平台概論 1
1.1 Java不只是語言 2
1.1.1 前世今生 2
1.1.2 三大平台 5
1.1.3 JCP與JSR 6
1.1.4 Oracle JDK與OpenJDK 7
1.1.5 建議的學習路徑 8
1.2 JVM/JRE/JDK 12
1.2.1 什麼是JVM 12
1.2.2 區分JRE與JDK 14
1.2.3 下載、安裝JDK 15
1.2.4 認識JDK安裝內容 18
1.3 重點複習 19
Chapter 2 從JDK到IDE 21
2.1 從Hello World開始 22
2.1.1 撰寫Java原始碼 22
2.1.2 PATH是什麼 24
2.1.3 JVM(java)與CLASSPATH 27
2.1.4 編譯程式(javac)與
CLASSPATH 29
2.2 管理原始碼與位碼文檔 30
2.2.1 編譯程式(javac)與
SOURCEPATH 30
2.2.2 使用package管理類 32
2.2.3 使用import偷懶 34
2.3 初識模組平台系統 36
2.3.1 JVM(java)與module-
path 37
2.3.2 編譯程式(javac)與
module-path 39
2.3.3 編譯程式(javac)與
module-source-path 40
2.4 使用IDE 41
2.4.1 IDE項目管理基礎 41
2.4.2 使用了哪個JRE47
2.4.3 類文檔版本49
2.5 重點複習51
Chapter3 基礎語法53
3.1 類型、變數與運算符54
3.1.1 類型54
3.1.2 變數57
3.1.3 運算符60
3.1.4 類型轉換65
3.2 流程控制68
3.2.1 if...else條件式68
3.2.2 switch條件式70
3.2.3 for循環72
3.2.4 while循環73
3.2.5 break、continue74
3.3 重點複習76
3.4 課後練習77
Chapter4 認識對象78
4.1 類與對象79
4.1.1 定義類79
4.1.2 使用標準類81
4.1.3 對象指定與相等性84
4.2 基本類型打包器86
4.2.1 打包基本類型86
4.2.2 自動裝箱、拆箱87
4.2.3 自動裝箱、拆箱的內幕88
4.3 數組對象90
4.3.1 數組基礎91
4.3.2 運算元組對象93
4.3.3 數組複製98
4.4 字元串對象100
4.4.1 字元串基礎101
4.4.2 字元串特性103
4.4.3 字元串編碼107
4.5 查詢JavaAPI檔案108
4.6 重點複習113
4.7 課後練習114
Chapter5 對象封裝116
5.1 何謂封裝117
5.1.1 封裝對象初始流程117
5.1.2 封裝對象操作流程119
5.1.3 封裝對象內部數據121
5.2 類語法細節123
5.2.1 public許可權修飾123
5.2.2 關於構造函式125
5.2.3 構造函式與方法重載126
5.2.4 使用this128
5.2.5 static類成員130
5.2.6 不定長度自變數135
5.2.7 內部類136
5.2.8 傳值調用138
5.3 重點複習140
5.4 課後練習141
Chapter6 繼承與多態142
6.1 何謂繼承143
6.1.1 繼承共同行為143
6.1.2 多態與is-a147
6.1.3 重新定義行為150
6.1.4 抽象方法、抽象類153
6.2 繼承語法細節154
6.2.1 protected成員154
6.2.2 重新定義的細節156
6.2.3 再看構造函式157
6.2.4 再看final關鍵字159
6.2.5 java.lang.Object160
6.2.6 關於垃圾收集165
6.2.7 再看抽象類167
6.3 重點複習169
6.4 課後練習170
Chapter7 接口與多態171
7.1 何謂接口172
7.1.1 接口定義行為172
7.1.2 行為的多態175
7.1.3 解決需求變化178
7.2 接口語法細節183
7.2.1 接口的默認183
7.2.2 匿名內部類187
7.2.3 使用enum枚舉常數190
7.3 重點複習192
7.4 課後練習193
Chapter8 異常處理194
8.1 語法與繼承架構195
8.1.1 使用try、catch195
8.1.2 異常繼承架構197
8.1.3 要抓還是要拋202
8.1.4 貼心還是造成麻煩205
8.1.5 認識堆疊追蹤206
8.1.6 關於assert210
8.2 異常與資源管理213
8.2.1 使用finally213
8.2.2 自動嘗試關閉資源215
8.2.3 java.lang.AutoCloseable
接口217
8.3 重點複習221
8.4 課後練習222
Chapter9 Collection與Map223
9.1 使用Collection收集對象224
9.1.1 認識Collection架構224
9.1.2 具有索引的List225
9.1.3 內容不重複的Set228
9.1.4 支持佇列操作的Queue232
9.1.5 使用泛型234
9.1.6 簡介Lambda表達式238
9.1.7 Interable與
Iterator240
9.2 鍵值對應的Map248
9.2.1 常用Map操作類249
9.2.2 訪問Map鍵值252
9.3 不可變的Collection
與Map255
9.3.1 淺談不可變特性255
9.3.2 Collections的unmodifiableXXX()方法256
9.3.3 List、Set、Map的of()方法258
9.4 重點複習260
9.5 課後練習262
Chapter10輸入/輸出263
10.1 InputStream與
OutputStream264
10.1.1 串流設計的概念264
10.1.2 串流繼承架構266
10.1.3 串流處理裝飾器269
10.2 字元處理類273
10.2.1 Reader與Writer繼承
架構274
10.2.2 字元處理裝飾器275
10.3 重點複習277
10.4 課後練習278
Chapter11 執行緒與並行API279
11.1 執行緒280
11.1.1 執行緒簡介280
11.1.2 Thread與Runnable282
11.1.3 執行緒生命周期284
11.1.4 關於ThreadGroup290
11.1.5 synchronized與
volatile292
11.1.6 等待與通知301
11.2 並行API305
11.2.1 Lock、ReadWriteLock與
Condition305
11.2.2 使用Executor313
11.2.3 並行Collection簡介323
11.3 重點複習326
11.4 課後練習327
Chapter12 Lambda328
12.1 認識Lambda語法329
12.1.1 Lambda語法概覽329
12.1.2 Lambda表達式與函式
接口332
12.1.3 Lambda遇上this與
final334
12.1.4 方法與構造函式參考336
12.1.5 接口默認方法338
12.2 Functional與StreamAPI343
12.2.1 使用Optional取代
null343
12.2.2 標準API的函式接口345
12.2.3 使用Stream進行管道
操作348
12.2.4 進行Stream的reduce
與collect351
12.2.5 關於flatMap()方法356
12.2.6 Stream相關API359
12.2.7 JDK9Optional與
Stream增強360
12.3 Lambda、平行化與異步
處理362
12.3.1 Stream與平行化362
12.3.2 Arrays與平行化366
12.4 重點複習370
12.5課後練習371
Chapter13 時間與日期372
13.1 認識時間與日期373
13.1.1 時間的度量373
13.1.2 年曆簡介374
13.1.3 認識時區375
13.2 認識Date與Calendar376
13.2.1 時間軸上瞬間的Date376
13.2.2 格式化時間日期的
DateFormat377
13.2.3 處理時間日期的
Calendar379
13.2.4 設定TimeZone382
13.3 新時間日期API383
13.3.1 機器時間觀點的API383
13.3.2 人類時間觀點的API385
13.3.3 對時間的運算387
13.3.4 年曆系統設計389
13.4 重點複習390
13.5 課後練習391
Chapter14 NIO與NIO2393
14.1 認識NIO394
14.1.1 NIO概述394
14.1.2 Channel架構與操作395
14.1.3 Buffer架構與操作396
14.2 NIO2檔案系統398
14.2.1 NIO2架構398
14.2.2 操作路徑399
14.2.3 屬性讀取與設定401
14.2.4 操作文檔與目錄404
14.2.5 讀取、訪問目錄406
14.2.6 過濾、搜尋文檔410
14.3 重點複習412
14.4 課後練習413
Chapter15 通用API414
15.1 日誌415
15.1.1 日誌API簡介415
15.1.2 指定日誌層級417
15.1.3 使用Handler與
Formatter419
15.1.4 自定義Handler、Formatter
與Filter420
15.1.5 使用logging.
properties422
15.2 國際化基礎423
15.2.1 使用ResourceBundle423
15.2.2 使用Locale424
15.3 規則表示式426
15.3.1 規則表示式簡介426
15.3.2 Pattern與Matcher433
15.4 處理數字435
15.4.1 使用BigInteger435
15.4.2 使用BigDecimal437
15.4.3 數字的格式化439
15.5 再談堆疊追蹤441
15.5.1 獲取
StackTraceElement441
15.5.2 JDK9的Stack-
WalkingAPI443
15.6 重點複習447
15.7 課後練習448
Chapter16 整合資料庫449
16.1 JDBC入門450
16.1.1 JDBC簡介450
16.1.2 連線資料庫454
16.1.3 使用Statement、
ResultSet459
16.1.4 使用PreparedStatement、
CallableStatement464
16.2 JDBC進階468
16.2.1 使用DataSource取得
在線上468
16.2.2 使用ResultSet捲動、
更新數據471
16.2.3 批次更新473
16.2.4 Blob與Clob474
16.2.5 交易簡介474
16.2.6 metadata簡介481
16.2.7 RowSet簡介484
16.3 重點複習486
16.4 課後練習487
Chapter17 反射與類載入器489
17.1 運用反射490
17.1.1 Class與.class文檔490
17.1.2 使用Class.forName()492
17.1.3 從Class獲得信息494
17.1.4 從Class建立對象496
17.1.5 操作對象方法與成員499
17.1.6 動態代理501
17.1.7 當反射遇上模組505
17.1.8 使用ServiceLoader511
17.2 了解類載入器513
17.2.1 JDK9類載入器層級513
17.2.2 建立ClassLoader
實例516
17.3 重點複習517
17.4 課後練習519
Chapter18 自定義泛型、枚舉與注釋520
18.1 自定義泛型521
18.1.1 使用extends與?521
18.1.2 使用super與?525
18.2 自定義枚舉528
18.2.1 了解java.lang.Enum類528
18.2.2 enum高級運用531
18.3 關於注釋536
18.3.1 常用標準注釋536
18.3.2 自定義注釋類型540
18.3.3 執行時期讀取注釋信息545
18.4 重點複習548
18.5 課後練習549
Chapter19 深入模組化550
19.1 運用模組551
19.1.1 模組的種類551
19.1.2 requires、exports與
opens細節554
19.1.3 修補模組557
19.1.4 放寬模組封裝與依賴558
19.2 模組API560
19.2.1 使用Module560
19.2.2 使用
ModuleDescriptor562
19.2.3 淺談ModuleLayer562
19.3 打包模組564
19.3.1 使用jar打包564
19.3.2 使用jmod打包566
19.3.3 使用jlink建立執行時期
映像568
19.4 重點複習569
19.5課後練習570
Appendix571
A.1 項目環境配置572
A.2 打開案例572
JavaSE9新功能索引
JavaSE9後的特性版本時間軸變動15
JDK9文檔實體布局變動18
初探模組平台系統36
javac新增-release參數50
支持Unicode8.054
內建jshell56
JavaAPI檔案支持搜尋功能112
StackTraceElement新增方法207
Try-with-resources語法改進217
定義匿名類別時的泛型語法改進239
List、Set、Map新增of()方法258
接口支持定義private方法340
Collectors新增filtering()方法356
Collectors新增flatMapping()方法359
Optional與Stream增強360
CompletableFuture增強369
支持UTF-8編碼的.properities檔案425
Stack-WalkingAPI443
反射與類載入器機制490
ElementType新增MODULE545
深入模組化551