內容簡介
前言
第1章 Java概述
1.1 Java演進史
1.1.1 Java簡史
1.1.2 Java大有可為
1.2 現代Java新特性:從Java 8到Java 12
1.2.1 Java 8新特性
1.2.2 Java 9新特性
1.2.3 Java 10新特性
1.2.4 Java 11新特性
1.2.5 Java 12新特性
1.3 如何來學習本書
1.3.1 學習的前置條件
1.3.2 如何使用本書
1.3.3 如何獲取源碼
1.4 開發環境配置及編寫第一個Java應用
1.4.1 JDK 12的下載
1.4.2 JDK 12的安裝
1.4.3 Eclipse的下載
1.4.4 Eclipse的安裝
1.4.5 Eclipse的配置
1.4.6 創建Java應用
1.4.7 創建模塊
1.4.8 創建Hello World程序
1.4.9 使用JUnit5
第2章 Java語言基礎
2.1 變量
2.1.1 命名
2.1.2 基本數據類型
2.1.3 基本數據類型的默認值
2.1.4 字麵值(Literal)
2.1.5 基本類型之間的轉換
2.1.6 數組(Array)
2.2 運算符
2.2.1 賦值運算符
2.2.2 算術運算符
2.2.3 一元運算符
2.2.4 等價和關係運算符
2.2.5 條件運算符
2.2.6 instanceof運算符
2.2.7 位運算和位移運算符
2.3 錶達式、語句和塊
2.3.1 錶達式
2.3.2 語句
2.3.3 塊
2.4 控製流程語句
2.4.1 if-then
2.4.2 if-then-else
2.4.3 switch
2.4.4 while
2.4.5 do-while
2.4.6 for
2.5 枚舉類型
2.6 泛型
2.6.1 泛型的作用
2.6.2 泛型類型
2.6.3 泛型方法
2.6.4 有界類型參數
2.6.5 泛型的繼承和子類型
2.6.6 通配符
2.6.7 類型擦除
2.6.8 使用泛型的一些限製
2.7 關鍵字
第3章 麵嚮對象編程基礎
3.1 編程的抽象
3.2 類(Class)的示例
3.3 對象的接口(Interface)
3.4 包(Package)
3.5 對象提供服務
3.6 隱藏實現的細節
3.6.1 為啥需要控製對成員的訪問
3.6.2 Java的作用域
3.7 實現的重用
3.8 繼承
3.8.1 Java中的繼承
3.8.2 關於Shape的討論
3.8.3 實戰:繼承的示例
3.9 is-a和is-like-a的關係
3.10 多態性(Polymorphism)
3.10.1 多態的定義
3.10.2 理解多態的好處
第4章 集閤框架
4.1 集閤框架概述
4.1.1 集閤框架的定義
4.1.2 Java集閤框架的優點
4.1.3 集閤框架常見的接口
4.1.4 集閤框架的實現
4.2 Collection接口
4.2.1 遍曆集閤
4.2.2 集閤接口批量操作
4.3 Set接口
4.3.1 HashSet、TreeSet和LinkedHashSet的比較
4.3.2 Set接口基本操作
4.3.3 Set接口批量操作
4.4 Map接口
4.4.1 Map接口基本操作
4.4.2 Map接口批量操作
4.4.3 Map集閤視圖
4.5 List接口
4.5.1 集閤操作
4.5.2 位置訪問和搜索操作
4.5.3 List的迭代器
4.5.4 範圍視圖操作
4.5.5 List常用算法
4.6 Queue接口
4.7 Deque接口
4.7.1 插入
4.7.2 移除
4.7.3 檢索
第5章 異常處理
5.1 異常捕獲與處理
5.1.1 先從一個例子入手
5.1.2 try塊
5.1.3 catch塊
5.1.4 在一個異常處理程序中處理多個類型的異常
5.1.5 finally塊
5.2 通過方法聲明異常拋齣
5.3 如何拋齣異常
5.3.1 throw語句
5.3.2 Throwable類及其子類
5.3.3 Error類
5.3.4 Exception類
5.4 異常鏈
5.4.1 訪問堆棧跟蹤信息
5.4.2 記錄異常日誌
5.5 創建異常類
5.5.1 一個創建異常類的例子
5.5.2 選擇超類
5.6 未檢查異常
5.7 使用異常帶來的優勢
5.7.1 將錯誤處理代碼與“常規”代碼分離
5.7.2 將錯誤沿調用推棧嚮上傳遞
5.7.3 對錯誤類型進行分組和區分
5.8 try-with-resources語句
5.8.1 手動關閉資源
5.8.2 Java 7中的try-with-resources介紹
5.8.3 try-with-resources在Java 9中的改進
5.9 實戰:使用try-with-resource
第6章 I/O處理
6.1 I/O流
6.1.1 字節流(Byte Streams)
6.1.2 字符流(Character Streams)
6.1.3 麵嚮行的I/O
6.1.4 刷新緩衝流
6.1.5 掃描和格式化文本
6.1.6 命令行I/O
6.1.7 數據流(Data Streams)
6.1.8 對象流(Object Streams)
6.2 文件I/O
6.2.1 路徑
6.2.2 Path類
6.2.3 Path的操作
6.2.4 文件操作
6.2.5 檢查文件或目錄
6.2.6 刪除文件或目錄
6.2.7 復製文件或目錄
6.2.8 移動一個文件或目錄
第7章 網絡編程
7.1 網絡基礎
7.1.1 瞭解OSI參考模型
7.1.2 TCP/IP網絡模型與OSI模型的對比
7.1.3 瞭解TCP
7.1.4 瞭解UDP
7.1.5 瞭解端口
7.2 Socket
7.2.1 瞭解Socket
7.2.2 實戰:實現一個echo服務器
7.3 I/O模型的演進
7.3.1 UNIX I/O模型的基本概念
7.3.2 UNIX I/O模型
7.3.3 常見Java I/O模型
7.4 HTTP Client API概述
7.5 HttpRequest
7.6 HttpResponse
7.7 實戰:HTTP Client API的使用例子
7.7.1 HTTP Client發起同步請求
7.7.2 發起異步請求
第8章 並發編程
8.1 瞭解綫程
8.1.1 綫程的狀態
8.1.2 進程和綫程
8.1.3 綫程和縴程
8.1.4 Java中的綫程對象
8.1.5 實戰:多綫程示例
8.2 並發編程是把雙刃劍
8.2.1 死鎖(Deadlock)
8.2.2 飢餓(Starvation)
8.2.3 活鎖(Livelock)
8.3 解決並發問題的常用方法
8.3.1 同步(Synchronization)
8.3.2 原子訪問(Atomic Access)
8.3.3 無鎖化設計提升並發能力
8.3.4 緩存提升並發能力
8.3.5 更細顆粒度的並發單元
8.4 守衛塊(Guarded Blocks)
8.5 不可變對象(Immutable Object)
8.5.1 一個同步類的例子
8.5.2 定義不可變對象的策略
8.6 高級並發對象
8.6.1 鎖對象
8.6.2 執行器
8.6.3 並發集閤
8.6.4 原子變量
8.6.5 並發隨機數
第9章 基本編程結構的改進
9.1 直接運行Java源代碼
9.1.1 Java 11可以執行運行Java源碼
9.1.2 原理
9.2 局部變量類型推斷
9.2.1 瞭解var聲明變量的一些限製
9.2.2 原理
9.3 實戰:var關鍵字的使用
9.4 字符串處理增強
9.4.1 支持Raw String Literals
9.4.2 原理
9.4.3 限製
9.4.4 Java 11常用String API
9.4.5 Java 12常用String API
9.5 實戰:Java 11字符串的使用
9.5.1 Raw String Literals的使用
9.5.2 String API的使用
9.6 支持Unicode標準
9.6.1 瞭解Unicode 10
9.6.2 在控製颱打印齣Emoji
9.6.3 在GUI中顯示齣Emoji
9.7 Optional
9.7.1 復現NullPointerException
9.7.2 Optional類的魔法
9.7.3 Optional類的其他方法
9.8 接口中的默認方法
9.9 實戰:接口中的默認方法的使用
9.10 接口中的靜態方法
9.11 實戰:接口中的靜態方法的使用
9.12 Switch錶達式增強
9.12.1 實戰:Switch錶達式的例子
9.12.2 使用Switch錶達式的注意事項
9.13 緊湊數字格式
第10章 垃圾迴收器的增強
10.1 瞭解G1
10.1.1 瞭解Java垃圾迴收機製
10.1.2 查找不再使用的對象
10.1.3 垃圾迴收算法
10.1.4 分代垃圾迴收
10.1.5 Java垃圾迴收器的曆史
10.1.6 瞭解G1的原理
10.1.7 瞭解G1 Young GC
10.1.8 瞭解G1 Mixed GC
10.2 瞭解ZGC
10.2.1 更短的停頓
10.2.2 ZGC的著色指針和讀屏障
10.2.3 讀屏障
10.2.4 GC工作原理
10.3 瞭解Epsilon
10.4 瞭解Shenandoah
10.4.1 Shenandoah工作原理
10.4.2 性能指標
第11章 使用腳本語言
11.1 什麼是JShell
11.2 為什麼需要JShell
11.3 JShell的基本操作
11.3.1 啓動JShell
11.3.2 退齣JShell
11.3.3 使用JShell測試API
11.3.4 使用JShell操作流
11.3.5 獲取幫助
11.4 實戰:JShell的綜閤用法
11.4.1 定義方法
11.4.2 使用自定義的方法
11.4.3 查看所有的變量及引用情況
11.4.4 保存曆史
11.4.5 打開文件
11.4.6 獲取變量的引用值
第12章 lambda錶達式及函數式編程
12.1 lambda錶達式
12.1.1 第一個lambda錶達式的例子
12.1.2 第二個lambda錶達式的例子
12.1.3 lambda錶達式簡寫的依據
12.2 方法引用
12.2.1 什麼是方法引用
12.2.2 實戰:方法引用的例子
12.3 構造函數引用
12.4 函數式接口
12.4.1 Predicate
12.4.2 Consumer
12.4.3 Function
12.4.4 總結
12.5 Consumer接口
12.5.1 andThen
12.5.2 IntConsumer
12.5.3 LongConsumer
12.5.4 DoubleConsumer
12.5.5 BiConsumer
12.6 Supplier接口
12.6.1 get
12.6.2 BooleanSupplier
12.6.3 IntSupplier
12.6.4 LongSupplier
12.6.5 DoubleSupplier
12.7 Predicate接口
12.7.1 test
12.7.2 negate
12.7.3 or
12.7.4 and
12.7.5 not
12.7.6 IntPredicate
12.7.7 BiPredicate
12.8 Function接口
12.8.1 compose
12.8.2 andThen
12.8.3 identity
12.9 類型檢查
12.10 類型推導
12.11 使用本地變量
第13章 Stream
13.1 Stream API概述
13.1.1 什麼是聚閤操作
13.1.2 什麼是Stream
13.1.3 Stream的構成
13.2 實例:Stream使用例子
13.2.1 傳統的過濾數據的做法
13.2.2 Stream過濾數據的做法
13.3 Stream與集閤的異同點
13.4 Stream常用操作
13.4.1 collect(toList())終止操作
13.4.2 map中間操作
13.4.3 filter中間操作
13.4.4 count終止操作
13.4.5 min終止操作
13.4.6 max終止操作
13.4.7 reduce終止操作
13.5 過濾數據
13.6 切分數據
13.6.1 使用Predicate切分數據
13.6.2 截斷Stream
13.6.3 跳過元素
13.7 映射
13.7.1 map
13.7.2 flatMap
13.8 查找和匹配
13.8.1 allMatch
13.8.2 anyMatch
13.8.3 noneMatch
13.8.4 findFirst
13.8.5 findAny
13.9 壓縮數據
13.9.1 計算總和
13.9.2 計算最大值和最小值
13.10 構造Stream
13.10.1 從值中構造
13.10.2 從nullable中構造
13.10.3 從數組中構造
13.10.4 從集閤中構造
13.10.5 從文件中構造
13.11 收集收據
13.11.1 Collector接口
13.11.2 Collectors
13.11.3 統計總數
13.11.4 計算最大值和最小值
13.11.5 求和
13.11.6 求平均數
13.11.7 連接字符串
13.11.8 分組
13.11.9 分區
13.12 並行計算
13.12.1 並行流
13.12.2 stream與parallelStream的抉擇
13.13 Spliterator接口
第14章 集閤的增強
14.1 集閤工廠
14.1.1 List工廠
14.1.2 Set工廠
14.1.3 Map工廠
14.2 實戰:List工廠的使用
14.3 實戰:Set工廠的使用
14.4 實戰:Map工廠的使用
14.5 List和Set常用方法
14.5.1 removeIf
14.5.2 replaceAll
14.6 實戰:removeIf方法的使用
14.7 實戰:replaceAll方法的使用
14.8 Map常用方法
14.8.1 forEach
14.8.2 sorted
14.8.3 getOrDefault
14.9 實戰:forEach方法的使用
14.10 實戰:排序的使用
14.11 實戰:getOrDefault的使用
14.12 實戰:計算操作
14.12.1 computeIfAbsent
14.12.2 computeIfPresent
14.12.3 compute
14.13 實戰:移除操作
14.14.1 replaceAll
14.14.2 replace
14.14 實戰:替換操作
14.15 實戰:閤並操作
14.16 ConcurrentHashMap的改進
14.16.1 Java 8之前的ConcurrentHashMap類
14.16.2 Java 8之後的ConcurrentHashMap類的改進
第15章 新的日期和時間API
15.1 瞭解LocalDate
15.2 瞭解LocalTime
15.3 瞭解LocalDateTime
15.4 瞭解Instant
15.5 瞭解Duration
15.6 瞭解Period
15.7 常用日期的操作
15.8 調整時間
15.9 格式化日期
15.10 時區處理
15.11 日曆
第16章 並發編程的增強
16.1 Stream的parallel()方法
16.2 執行器及綫程池
16.2.1 綫程及綫程數
16.2.2 綫程池
16.2.3 Java 8中的Executors增強
16.2.4 瞭解綫程池的的風險
16.3 Future API
16.3.1 並行提交任務
16.3.2 順序返迴結果
16.4 CompletableFuture
16.4.1 CompletionStage
16.4.2 CompletableFuture
16.4.3 CompletableFuture類使用示例
16.5 異步API中的異常處理
16.6 box-and-channel模型
16.7 實例:在綫商城
16.8 實例:同步方法轉為異步
16.8.1 異常處理
16.8.2 使用supplyAsync簡化代碼
第17章 模塊化(Jigsaw)
17.1 為什麼需要模塊化
17.1.1 體積大
17.1.2 訪問控製粒度不夠細
17.1.3 依賴地獄
17.2 用模塊化開發和設計Java應用
17.2.1 模塊的聲明
17.2.2 模塊的零件
17.2.3 模塊描述
17.2.4 平颱模塊
第18章 響應式編程
18.1 響應式編程概述
18.1.1 Flow Control的幾種方案
18.1.2 Pull、Push與Pull-Push
18.1.3 Flow API與Stream API
18.2 Flow API
18.2.1 訂閱者Subscriber
18.2.2 Subscriber示例
18.2.3 發布者Publisher
18.2.4 訂閱Subscription
18.2.5 處理器Processor
18.3 實戰:響應式編程綜閤示例
18.3.1 定義Subscriber
18.3.2 定義Publisher
18.3.3 運行應用
參考文獻
· · · · · · (
收起)