2022年7月30日 星期六

2022-J03-Memo

2022年7月23日 星期六

OCP: Java SE 11 Developer 認證指南(下) - API剖析運用篇


|CHAPTER 01| 泛型(Generics)和集合物件(Collections)

1.1.   泛型(Generics)
1.1.1. 使用泛型設計的效益
1.1.2. 使用泛型設計類別
1.1.3. 使用泛型設計的類別
1.2.   集合物件(Collections)
1.2.1. 集合物件的定義和種類
1.2.2. List
1.2.3. 自動裝箱(Boxing)和開箱(Unboxing)
1.2.4. Set
1.2.5. Deque(Queue)
1.3.   Map
1.4.   集合物件成員的排序
1.4.1. 排序的做法
1.4.2. 使用Comparable介面排序
1.4.3. 使用Comparator介面排序
1.5.   使用of()與copyOf()方法建立List、Set與Map物件
1.5.1. 使用of()方法建立List、Set與Map物件
1.5.2. 使用copOf()方法建立List、Set與Map物件
1.5.3. 使用Arrays.asList()方法建立List物件

|CHAPTER 02| 例外(Exceptions)與斷言(Assertions)

2.1.   例外(Exceptions)
2.1.1. 使用try-catch程式碼區塊
2.1.2. 使用try-with-resources程式碼區塊和AutoCloseable介面
2.1.3. Suppressed Exceptions
2.1.4. 使用multi-catch敘述
2.1.5. 使用throws宣告
2.1.6. 建立客製的Exception類別
2.1.7. Exception物件的捕捉再拋出
2.2.   斷言(Assertions)
2.2.1. Assertions的簡介和語法
2.2.2. Assertions的使用

|CHAPTER 03| 輸入與輸出(I/O)

3.1.   I/O基礎 
3.1.1. 何謂I/O?
3.1.2. 處理串流的類別
3.1.3. 串流類別的串接
3.1.4. 使用java.io.File類別
3.2.   由主控台讀寫資料
3.2.1. 主控台的I/O
3.2.2. 使用標準輸出方法
3.2.3. 使用標準輸入由主控台取得輸入資料
3.2.4. java.io.Console類別介紹
3.3.   Channel I/O
3.4.   使用序列化技術讀寫物件

3.4.1. Java裡的資料保存(Persistence)
3.4.2. 序列化和物件圖譜
3.4.3. 不需要參加序列化的欄位
3.4.4. 定義物件保存的版本號碼
3.4.5. 序列化和反序列化範例

|CHAPTER 04| NIO.2

4.1.   NIO.2基礎
4.1.1. java.io.File 的限制
4.1.2. Java I/O套件發展歷史
4.1.3. 檔案系統、路徑和檔案
4.1.4. Symbolic Link檔案
4.1.5. NIO.2的基本架構
4.2.   使用Path介面操作檔案/目錄
4.2.1. Path介面
4.2.2. Path介面主要功能
4.2.3. 移除路徑裡的多餘組成
4.2.4. 建立子路徑
4.2.5. 結合2個路徑
4.2.6. 建立連接2個路徑的路徑
4.2.7. Hard Link
4.2.8. 處理Symbolic Link
4.3.   使用Files類別對檔案/目錄進行檢查、刪除、複製、移動
4.3.1. 處理檔案
4.3.2. 檢查檔案/目錄是否存在
4.3.3. 檢查檔案/目錄屬性
4.3.4. 建立檔案/目錄
4.3.5. 刪除檔案/目錄
4.3.6. 複製和移動檔案/目錄
4.3.7. Stream和Path互相複製
4.3.8. 列出目錄內容
4.3.9. 讀取和寫入檔案
4.4.   使用Files類別操作channel I/O和stream I/O讀寫檔案
4.4.1. 介面Channel和類別ByteBuffer
4.4.2. 隨機存取檔案
4.4.3. 對文字檔提供Buffered I/O方法
4.4.4. 取得Byte Streams的方法
4.5.   讀寫檔案/目錄的屬性
4.5.1. 使用Files管理檔案的屬性資料
4.5.2. 讀取檔案屬性
4.5.3. 修改檔案屬性
4.5.4. DOS之外的File Attribute Views
4.5.5. POSIX檔案系統的權限
4.6.   遞迴存取目錄樹
4.6.1. 對檔案目錄進行遞迴操作
4.7.   使用PathMatcher類別找尋符合的檔案
4.7.1. 搜尋檔案
4.7.2. glob樣式語法介紹
4.8.   其他
4.8.1. 使用FileStore類別
4.8.2. 使用WatchService
4.8.3. 由基礎I/O轉換至NIO.2

|CHAPTER 05| 執行緒(Threads)

5.1.   執行緒介紹
5.1.1. 名詞說明
5.1.2. 多執行緒的重要性
5.1.3. 執行緒類別
5.2.   執行緒常見的問題
5.2.1. 使用Shared Data可能造成的問題
5.2.2. 使用Non-Atomic Functions可能造成的問題
5.2.3. 使用Cached Data可能造成的問題
5.3.   執行緒的synchronized與等待
5.3.1. 使用synchronized關鍵字
5.3.2. 使用synchronized的時機
5.3.3. 縮小synchronized的程式區塊
5.3.4. 其他執行等待的情況
5.4.   其他執行緒方法介紹
5.4.1. 使用interrupt()方法
5.4.2. 使用sleep()方法
5.4.3. 使用其他方法
5.4.4. 不建議使用的方法

|CHAPTER 06| 執行緒與並行API(Concurrent API)

6.1.   使用並行API
6.1.1. 並行API介紹
6.1.2. AtomicInteger類別
6.1.3. ReentrantReadWriteLock類別
6.1.4. 執行緒安全的集合物件
6.1.5. 常用的同步器工具類別
6.2.   使用ExecutorService介面同時執行多樣工作
6.2.1. 使用更高階的多執行緒執行方案
6.2.2. ExecutorService概觀
6.2.3. 使用java.util.concurrent.Callable
6.2.4. 使用java.util.concurrent.Future
6.2.5. 關閉ExecutorService
6.2.6. ExecutorService完整範例
6.2.7. ExecutorService進階範例
6.3.   使用Fork-Join框架同時執行多樣工作
6.3.1. 平行處理的策略
6.3.2. 套用Fork-Join框架
6.3.3. Fork-Join框架的使用建議

|CHAPTER 07| 使用JDBC建立資料庫連線

7.1.  了解 Database、DBMS和SQL
7.1.1. 基本名詞介紹
7.1.2. 使用SQL存取資料庫
7.1.3. Derby資料庫介紹
7.1.4. 操作Derby資料庫
7.2.   使用Eclipse連線並存取資料庫
7.2.1. 連線資料庫
7.2.2. 存取資料表
7.3.   使用JDBC
7.3.1. JDBC API概觀
7.3.2. 專案引用資料庫驅動函式庫
7.3.3. 認識JDBC驅動函式庫JAR的組成
7.3.4. 開發JDBC程式
7.3.5. 結束JDBC相關物件的使用
7.3.6. 開發可攜式的JDBC程式碼
7.3.7. 使用java.sql.SQLException類別
7.3.8. Statement介面與SQL敘述的執行
7.3.9. 使用ResultSetMetaData介面
7.3.10.取得查詢結果的資料筆數
7.3.11.控制ResultSet每次由資料庫取回的筆數
7.3.12.使用PreparedStatement介面
7.3.13.使用CallableStatement介面
7.4.   使用JDBC進行交易
7.4.1. 何謂資料庫交易?
7.4.2. 使用JDBC的交易
7.5.   使用JDBC 4.1的RowSetProvider和RowSetFactory
7.6.   回顧DAO設計模式


|CHAPTER 08| Java的區域化 (Localization)

8.1 了解Java的軟體區域化作法
8.1.1 使用Locale類別
8.1.2 建立多國語系文字檔
8.1.3. 使用ResourceBundle類別
8.2 使用DateFormat類別提供日期的區域化顯示
8.3 使用NumberFormat類別提供幣別的區域化顯示

|CHAPTER 09| Lambda表示式的應用

9.1.   使用Lambda表示式
9.1.1. 匿名類別與功能性介面回顧
9.1.2. Lambda表示式語法回顧
9.2.   使用內建的功能性介面
9.2.1. 評斷型(predicate)功能性介面
9.2.2. 消費型(consumer)功能性介面
9.2.3. 功能型(function)功能性介面
9.2.4. 供應型(supplier)功能性介面
9.3.   在泛型內使用萬元字元
9.3.1. 在泛型裡使用多型
9.3.2. 存取使用<?>的泛型的集合物件
9.4.   使用其他內建的功能性介面
9.4.1. 基於4個基礎功能性介面的基本型別變形版
9.4.2. 基於Binary(二運算元相關)及其基本型別變形版
9.4.3. 基於Unary(單運算元相關)及其基本型別變形版
9.5.   使用方法參照
9.5.1. 方法參照使用類別方法且來自其他類別
9.5.2. 方法參照使用物件方法且物件參考來自Lambda表示式之外
9.5.3. 方法參照使用物件方法且物件參考來自Lambda表示式之內
9.5.4. 使用new呼叫建構子且建構子不帶參數
9.5.5. 使用new呼叫建構子且建構子帶少量參數
9.5.6. 使用new呼叫建構子且建構子帶多參數

|CHAPTER 10| 使用Stream API

10.1.   建構者設計模式和方法鏈結
10.2.   使用Optional類別
10.2.1. 使用null造成的困擾
10.2.2. 類別Optional的使用情境
10.2.3. 類別Optional的常用方法
10.3.   Stream API介紹
10.3.1. 介面Iterable和Collection的擴充
10.3.2. Stream API
10.4.   Stream API操作
10.4.1. 中間作業
10.4.2. 終端作業
10.4.3. 終端作業collect()與Collectors API
10.4.4. 短路型終端作業
10.5.   Stream API和NIO.2
10.6.   Stream API操作平行化

10.6.1. 平行化的前提
10.6.2. 平行化的作法
10.6.3. Reduction操作

|CHAPTER 11| Date/Time API

11.1.   Java 8在Date & Time相關類別的進步
11.2.   當地日期與時間
11.2.1. 類別LocalDate
11.2.2. 類別LocalTime
11.2.3. 類別LocalDateTime
11.3.   時區和日光節約時間
11.3.1. 時區和日光節約時間簡介
11.3.2. Java 8在時區和日光節約時間的應用
11.4.   描述日期與時間的數量
11.4.1. 類別Instant
11.4.2. 類別Period和Duration
11.4.3. 使用流暢(fluent)的程式風格

|CHAPTER 12| 標註型別(Annotation)

12.1.   認識標註型別
12.1.1. 認識Metadata
12.1.2. 標註型別的目的
12.2.   建立自定義標註型別
12.2.1. 建立標註型別
12.2.2. 定義必要(required)元素
12.2.3. 定義非必要(optional)元素
12.2.4. 定義元素型態(type)
12.2.5. 定義元素修飾詞
12.2.6. 定義常數變數
12.3.   標註型別的應用
12.3.1. 在宣告時使用標註型別
12.3.2. 定義名稱為value()的元素
12.3.3. 元素值為陣列的應用方式
12.4.   自定義標註型別時使用的內建標註型別
12.4.1. 以@Target限制使用標的
12.4.2. 以@Retention決定作用範圍
12.4.3. 以@Documented支援API文件顯示
12.4.4. 以@Inherited取得父類別標註型別
12.4.5. 以@Repeatable支援同一標的重複使用
12.4.6. 本章內建標註型別總結
12.5.   開發一般程式碼經常使用的內建標註型別
12.5.1. 使用@Override標註覆寫的方法
12.5.2. 使用@FunctionalInterface宣告介面
12.5.3. 使用@Deprecated停用程式碼
12.5.4. 使用@SuppressWarnings忽略警告
12.5.5. 使用@SafeVarargs保護參數
12.5.6. 本章內建標註型別總結

|CHAPTER 13| Java平台模組系統(Java Platform Module System)

13.1.   認識Java模組化
13.1.1. 介紹模組(Module)
13.1.2. 模組化的效益
13.2.   建立並執行模組化程式
13.2.1. 建立模組專案
13.2.2. 編譯模組專案
13.2.3. 執行模組專案
13.2.4. 打包模組專案
13.3.   建立相依模組程式
13.3.1. 使用exports開放模組內的套件
13.3.2. 使用requires相依模組外的套件
13.3.3. 使用Eclipse設定專案的模組相依關係
13.4.   認識module-info.java的宣告關鍵字
13.4.1. 使用exports
13.4.2. 使用requires和requires transitive
13.4.3. 使用provides、uses、opens
13.5.   在命令列(command line)使用模組指令選項
13.5.1. 使用java指令
13.5.2. 使用jar指令
13.5.3. 使用jdeps指令
13.5.4. 使用jmod指令
13.5.5. 指令彙整

|CHAPTER 14| 模組化應用程式

14.1.   回顧模組指令
14.2.   比較模組類型

14.2.1. 命名模組
14.2.2. 自動模組
14.2.3. 未命名模組
14.2.4. 比較模組類型
14.3.   分析JDK依賴關係
14.3.1. 識別內建模組
14.3.2. 使用JDEPS
14.4.   模組化既有應用程式
14.4.1. 確定函式庫相依順序
14.4.2. 使用由下而上的模組化策略
14.4.3. 使用由上而下的模組化策略
14.4.4. 解構與模組化單體應用程式
14.4.5. 循環的相依性導致無法編譯
14.5.   模組化Java服務結構
14.5.1. 建立服務提供者介面模組
14.5.2. 建立服務定位器模組
14.5.3. 建立用戶端程式模組
14.5.4. 建立服務提供者介面實作模組
14.5.5. 合併服務提供者介面模組之外的所有模組

|CHAPTER 15| 開發安全的Java程式

15.1.   設計安全物件
15.1.1. 限制可存取性
15.1.2. 限制可繼承性
15.1.3. 建立不可更改(immutable)物件
15.1.4. 複製(clone)物件
15.2.   注入(injection)攻擊與輸入(input)驗證
15.2.1. 使用PreparedStatement避免SQL注入攻擊
15.2.2. 使用輸入驗證(Input Validation)過濾無效輸入
15.3.   處理機敏資訊
15.3.1. 保護機敏資料的輸出
15.3.2. 保護記憶體中的資料
15.4.   序列化與反序列化物件
15.4.1. 指定序列化的物件欄位
15.4.2. 客製序列化流程
15.4.3. 改變序列化與反序列化的結果
15.5.   建立保護機敏資料的安全物件
15.5.1. 宣告方法為final
15.5.2. 宣告類別為final
15.5.3. 宣告建構子為private
15.6.   避免服務阻斷(denial of service)攻擊
15.6.1. 避免資源滲漏
15.6.2. 避免讀取大量資源
15.6.3. 避免數字溢位(overflow)
15.6.4. 避免資料結構的濫用

|CHAPTER 16| 擬真試題實戰詳解

2022年7月22日 星期五

OCP: Java SE 11 Developer 認證指南(上) - 物件導向設計篇


【內容簡介】

Oracle公司繼Java 8推出1Z0-808與1Z0-809認證考試科目後,原本在次一個長期支援版本的Java 11也推出1Z0-815與1Z0-816的雙考試,但在2020/10/01之後,改以1Z0-819取代前兩者,成為現行要取得「Oracle Certified Professional: Java SE 11 Developer」證照的唯一考試科目。

雖然由兩科考試合併為一科,但考試範圍並未縮減。作者依據原廠公布的命題範圍,深入研讀相關文件,推出上、下兩冊認證指南,分別是:
  • OCP:Java SE 11 Developer認證指南(上) - 物件導向設計篇
  • OCP:Java SE 11 Developer認證指南(下) - API剖析運用篇
上冊以基本語法入門,以至於了解封裝、繼承、多型等物件導向程式的撰寫方式與設計模式實作,也包含列舉型別、巢狀類別、lamdba表示式等特殊語法講授。

下冊聚焦Java API應用,包含泛型、集合物件與Map族群、基礎IO與NIO.2、執行緒與並行架構、JDBC連線資料庫、多國語系、lamdba進階與Stream類別族群、日期時間類別族群、標註型別、模組化應用、資訊安全等豐富主題。

兩冊並有依據原廠命題範圍而蒐錄編寫的擬真試題實戰與詳解,讀者可依自己的學習狀況分冊選讀,以掌握新版Java SE11的特色,並熟悉認證考試的重點。

【目錄】

|CHAPTER 01| Java歷史與證照介紹

1.1 誰在使用Java?
1.2 Java的歷史
1.3 Java的4大應用領域
1.4 Java認證考試介紹

|CHAPTER 02| Java程式語言簡介

2.1 Java程式語言的特色
2.2 Java的跨平台運行
2.3 JDK、JRE、JVM的區別
2.4 IDE介紹

|CHAPTER 03| 物件導向的程式設計思維

3.1 以物件導向的思考方式分析程式需求
3.2 塑模與UML


|CHAPTER 04| 認識Java語法與建立類別

4.1 定義類別及其成員
4.2 認識Java關鍵字
4.3 認識main方法
4.4 使用javac、java、jar指令建立並執行程式
4.5 使用Eclipse匯入範例專案並執行程式

|CHAPTER 05| 認識變數與Java基本型別

5.1 認識Java的基本型別、變數和常數
5.2 使用運算子
5.3 使用升等和轉型


|CHAPTER 06| 使用參考型別操作物件與var宣告

6.1 使用物件參考
6.2 使用String類別
6.3 使用StringBuilder類別
6.4 使用Java API文件
6.5 基本型別的包覆類別
6.6 使用var宣告變數


|CHAPTER 07| 使用選擇結構和相關運算子

7.1 選擇結構簡介
7.2 使用關係、條件運算子
7.3 使用if選擇結構
7.4 使用switch選擇結構

|CHAPTER 08| 陣列

8.1 一維陣列與二維陣列
8.2 存取陣列內容
8.3 使用指令列的args陣列參數
8.4 使用ArrayList類別

|CHAPTER 09| 使用重複結構

9.1 迴圈架構簡介
9.2 使用while迴圈
9.3 使用for迴圈
9.4 使用巢狀迴圈
9.5 使用for迴圈存取陣列
9.6 使用do-while迴圈
9.7 比較重複結構


|CHAPTER 10| 方法的設計與使用

10.1 使用方法
10.2 宣告static方法和變數
10.3 建立多載(Overloaded)的方法
10.4 認識Java傳遞變數的機制


|CHAPTER 11| 物件導向程式設計(一)

11.1 認識封裝
11.2 使用建構子
11.3 認識繼承
11.4 繼承和建構子的關係
11.5 使用父類別和子類別
11.6 認識多型
11.7 使用介面
11.8 認識物件始祖Object類別

|CHAPTER 12| 物件導向程式設計(二)

12.1 再談封裝
12.2 建立子類別和使用繼承關係
12.3 多載方法與使用可變動參數個數的方法
12.4 再談多型

|CHAPTER 13| 程式執行異常處理

13.1 執行時的異常與例外物件(Exception)
13.2 例外的傳播與處理
13.3 例外的繼承結構
13.4 處理例外的好習慣

|CHAPTER 14| 類別設計(一)

14.1 認識public、protected、private與預設的存取控管機制
14.2 覆寫(Override)方法
14.3 認識轉型的機制
14.4 覆寫Object類別的方法

|CHAPTER 15| 類別設計(二)

15.1 使用抽象類別
15.2 使用static宣告
15.3 使用final宣告
15.4 實作獨體設計模式
15.5 使用列舉型別(enum)
15.6 使用巢狀類別


|CHAPTER 16| 介面設計

16.1 使用介面與abstract方法
16.2 介面與設計模式
16.3 使用複合(Composition)
16.4 以default與static宣告介面方法並實作內容


|CHAPTER 17| Lambda表示式入門

17.1 Lambda表示式介紹
17.2 功能性介面(Functional Interface)與Lambda表示式
17.3 使用內建的功能性介面

|CHAPTER 18| 擬真試題實戰詳解