![]() ![]() |
Java程序員修煉之道(第2版) 讀者對象:本書適用于JAVA語言程序設(shè)計(jì)相關(guān)專業(yè)師生及從業(yè)者 ![]()
《Java 程序員修煉之道(第2 版)》是為有志成為卓越 Java 開發(fā)者的人編寫的實(shí)用指南。相比于第 1 版,第 2 版擴(kuò)展了內(nèi)容,深入探討了 Java 8、11 及更高版本的特性。本書不僅覆蓋了 Java 語言本身的新特性,還引入了與現(xiàn)代開發(fā)實(shí)踐息息相關(guān)的主題,包括函數(shù)式編程、并發(fā)、多語言編程及容器化部署等。本書的核心目標(biāo)是幫助開發(fā)者建立扎實(shí)的基礎(chǔ),掌握 Java 語言和 JVM 平臺的深層知識,同時(shí)引導(dǎo)讀者了解 Java 生態(tài)中的非 Java 語言,如 Kotlin 和 Clojure。通過對 Java 語言核心原理的學(xué)習(xí),讀者將掌握如何高效地使用 Java,如何應(yīng)對日益復(fù)雜的開發(fā)環(huán)境,并理解平臺的未來演化方向。
Java 是企業(yè)級開發(fā)的核心引擎,真正精通 Java 的程序員,永遠(yuǎn)不愁好工作,更能參與有趣的項(xiàng)目!本書由Java Champions 和資深架構(gòu)師聯(lián)手打造,凝結(jié)數(shù)十年 Java 實(shí)戰(zhàn)經(jīng)驗(yàn),讓你少走彎路,掌握真正能在工作中派上用場的核心技能!
通過本書,你將突破 API 級別的學(xué)習(xí),直擊字節(jié)碼、性能調(diào)優(yōu)、高并發(fā)優(yōu)化等高價(jià)值技術(shù),并精通 Maven、Gradle 在 CI/CD 流程中的應(yīng)用,同時(shí)還能掌握 Kotlin、Clojure 這些新潮的 JVM 語言到底怎么和 Java 無縫協(xié)作。
本杰明·J. 埃文斯(Benjamin J. Evans)
全球 Java 領(lǐng)域最具影響力的技術(shù)專家之一。作為 Java Champion,他在 Java 社區(qū)享有崇高聲譽(yù),參與制定Java標(biāo)準(zhǔn),直接影響 Java 生態(tài)的發(fā)展方向。目前擔(dān)任紅帽公司首席軟件工程師,致力于企業(yè)級 Java 解決方案的創(chuàng)新與優(yōu)化。
杰森·克拉克(Jason Clark)
New Relic 公司首席工程師和架構(gòu)師,專注于高性能分布式系統(tǒng)、云計(jì)算和 Java 生態(tài)的優(yōu)化。他在企業(yè)級軟件開發(fā)、微服務(wù)架構(gòu)和 JVM 深度優(yōu)化方面有豐富的經(jīng)驗(yàn)。
馬丁·韋爾伯格(Martijn Verburg)
Java 生態(tài)領(lǐng)域的頂尖技術(shù)領(lǐng)袖之一,AdoptOpenJDK(現(xiàn)為 Eclipse Adoptium) 聯(lián)合創(chuàng)始人,現(xiàn)任微軟首席工程組經(jīng)理(Java & Golang)。同時(shí),馬丁是倫敦 Java 社區(qū)(LJC)的聯(lián)合領(lǐng)導(dǎo)者,致力于推動 Java 技術(shù)在全球開發(fā)者社區(qū)中的普及與創(chuàng)新。他在多個(gè) Java 規(guī)范組織中擔(dān)任重要角色,直接參與 Java 標(biāo)準(zhǔn)的制定與演進(jìn)。
第 一部分 從 Java 8 到 Java 17 及更高版本
第 1章 現(xiàn)代 Java 介紹 2 1.1 Java 語言和 Java 平臺 2 1.2 Java 的新發(fā)布模型 4 1.3 類型推斷增強(qiáng)(var 關(guān)鍵字) 7 1.4 語言和平臺的更改 10 1.4.1 撒點(diǎn)兒糖 11 1.4.2 語言更改 11 1.4.3 JSR 和 JEP 12 1.4.4 孵化特性和預(yù)覽特性 12 1.5 Java 11 中的小變更 13 1.5.1 集合工廠(JEP 213) 13 1.5.2 移除企業(yè)版模塊(JEP 320) 14 1.5.3 HTTP/2(Java 11) 15 1.5.4 單文件源代碼程序(JEP 330) 19 小結(jié) 21 第 2章 Java 模塊 22 2.1 場景設(shè)置 22 2.1.1 Jigsaw 項(xiàng)目 23 2.1.2 模塊圖 26 2.1.3 保護(hù)內(nèi)部 27 2.1.4 新的訪問控制語義 28 2.2 模塊的基本語法 29 2.2.1 導(dǎo)出和依賴 30 2.2.2 傳遞性 31 2.3 模塊加載 32 2.3.1 平臺模塊 32 2.3.2 應(yīng)用模塊 33 2.3.3 自動模塊 33 2.3.4 未命名模塊 34 2.4 構(gòu)建模塊化應(yīng)用程序 34 2.4.1 模塊的命令行開關(guān) 35 2.4.2 運(yùn)行模塊化應(yīng)用 37 2.4.3 模塊與反射 38 2.5 模塊架構(gòu) 39 2.5.1 拆分包 40 2.5.2 Java 8 運(yùn)行時(shí)精簡模式 40 2.5.3 多版本 JAR 42 2.6 超越模塊 45 小結(jié) 46 第3章 Java 17 47 3.1 文本塊 47 3.2 switch 表達(dá)式 48 3.3 record 51 3.3.1 名義類型 56 3.3.2 緊湊記錄構(gòu)造器 58 3.4 sealed 59 3.5 instanceof 的新用法 63 3.6 模式匹配和預(yù)覽特性 65 小結(jié) 67 第二部分 內(nèi)部原理 第4章 類文件和字節(jié)碼 70 4.1 類加載和類對象 71 4.1.1 加載和鏈接 72 4.1.2 類對象 73 4.2 類加載器 74 4.2.1 自定義類加載器 76 4.2.2 模塊和類加載 82 4.3 檢查類文件 82 4.3.1 javap 簡介 83 4.3.2 方法簽名的內(nèi)部表示形式 83 4.3.3 常量池 84 4.4 字節(jié)碼 87 4.4.1 分解類文件 87 4.4.2 運(yùn)行時(shí)環(huán)境 89 4.4.3 操作碼介紹 91 4.4.4 加載和存儲操作碼 92 4.4.5 數(shù)學(xué)運(yùn)算操作碼 93 4.4.6 流程控制操作碼 93 4.4.7 調(diào)用操作碼 94 4.4.8 平臺操作碼 97 4.4.9 操作碼的快捷形式 97 4.5 反射 98 4.5.1 反射概述 98 4.5.2 類加載與反射 100 4.5.3 反射的局限性 101 小結(jié) 102 第5章 Java 并發(fā)基礎(chǔ) 103 5.1 并發(fā)理論 104 5.1.1 我已經(jīng)了解線程了 104 5.1.2 硬件 104 5.1.3 Amdahl 定律 105 5.1.4 Java 的線程模型 106 5.1.5 經(jīng)驗(yàn)教訓(xùn) 107 5.2 設(shè)計(jì)原則 107 5.2.1 安全性 107 5.2.2 活躍度 108 5.2.3 性能 109 5.2.4 重用性 109 5.2.5 這些設(shè)計(jì)原則為何以及如何 相互沖突 109 5.2.6 系統(tǒng)開銷之源 110 5.3 塊結(jié)構(gòu)并發(fā) 110 5.3.1 同步與鎖 111 5.3.2 線程的狀態(tài)模型 112 5.3.3 完全同步對象 113 5.3.4 死鎖 114 5.3.5 為什么要同步 117 5.3.6 volatile 關(guān)鍵字 118 5.3.7 Thread 類的狀態(tài)和方法 119 5.3.8 不變性 124 5.4 Java 內(nèi)存模型 128 5.5 通過字節(jié)碼理解并發(fā) 129 5.5.1 更新丟失 131 5.5.2 同步的字節(jié)碼表示 133 5.5.3 同步方法 136 5.5.4 非同步讀取 137 5.5.5 重溫死鎖 139 5.5.6 重溫死鎖解決方案 141 5.5.7 易失性訪問 145 小結(jié) 147 第6章 JDK 并發(fā)庫 148 6.1 現(xiàn)代并發(fā)程序的構(gòu)建塊 148 6.2 原子類 149 6.3 鎖 150 6.4 CountDownLatch 152 6.5 ConcurrentHashMap 154 6.5.1 簡化版 HashMap 154 6.5.2 Dictionary 的局限性 157 6.5.3 并發(fā) Dictionary 158 6.5.4 使用 ConcurrentHashMap 160 6.6 CopyOnWriteArrayList 162 6.7 阻塞隊(duì)列 165 6.7.1 使用 BlockingQueue API 170 6.7.2 使用工作單元 171 6.8 Future 172 6.9 任務(wù)與執(zhí)行 175 6.9.1 任務(wù)建模 176 6.9.2 執(zhí)行器 177 6.9.3 單線程執(zhí)行器 178 6.9.4 大小固定的線程池 178 6.9.5 緩存線程池 179 6.9.6 ScheduledThreadPool-Executor 180 小結(jié) 181 第7章 理解 Java 性能 182 7.1 性能術(shù)語:基本定義 184 7.1.1 時(shí)延 184 7.1.2 吞吐量 185 7.1.3 利用率 185 7.1.4 效率 185 7.1.5 容量 185 7.1.6 可擴(kuò)展性 185 7.1.7 退化 185 7.2 性能分析的實(shí)用方法 186 7.2.1 知道自己在測量什么 186 7.2.2 了解如何進(jìn)行測量 187 7.2.3 知道性能目標(biāo)是什么 188 7.2.4 知道什么時(shí)候停止 188 7.2.5 了解實(shí)現(xiàn)更高性能的成本 189 7.2.6 了解過早優(yōu)化的危險(xiǎn) 189 7.3 出了什么問題,我們?yōu)槭裁匆P(guān)心 190 7.3.1 摩爾定律 190 7.3.2 理解內(nèi)存延遲層級 192 7.4 Java 性能調(diào)優(yōu)為什么這么難 193 7.4.1 時(shí)間在性能調(diào)優(yōu)中的作用 194 7.4.2 理解緩存未命中 195 7.5 垃圾收集 196 7.5.1 基礎(chǔ)知識 197 7.5.2 標(biāo)記-清除 197 7.5.3 內(nèi)存區(qū)域 199 7.5.4 新生代垃圾收集 199 7.5.5 老年代垃圾收集 200 7.5.6 安全點(diǎn) 200 7.5.7 G1:Java 的默認(rèn)垃圾收集器 200 7.5.8 并行收集器 202 7.5.9 GC 配置參數(shù) 203 7.6 使用 HotSpot 進(jìn)行 JIT 編譯 204 7.6.1 為什么要?jiǎng)討B(tài)編譯 205 7.6.2 HotSpot 簡介 205 7.6.3 內(nèi)聯(lián)方法 206 7.6.4 動態(tài)編譯和單態(tài)分派 207 7.6.5 理解編譯日志 207 7.6.6 逆優(yōu)化 208 7.7 JDK 飛行記錄器 209 7.7.1 JFR 209 7.7.2 JMC 210 小結(jié) 215 第三部分 JVM 上的多語言編程 第8章 JVM 語言 218 8.1 語言生態(tài)學(xué) 218 8.1.1 解釋型語言與編譯型語言 219 8.1.2 動態(tài)類型語言與靜態(tài)類型語言 219 8.1.3 命令式語言與函數(shù)式語言 220 8.1.4 對現(xiàn)有語言的重新實(shí)現(xiàn)與原始 JVM 語言 221 8.2 JVM 上的多語言編程 222 8.2.1 為什么使用非 Java 語言 223 8.2.2 新興語言 225 8.2.3 那些我們沒有選擇的語言 226 8.3 如何為項(xiàng)目選擇非 Java 語言 227 8.3.1 項(xiàng)目域的風(fēng)險(xiǎn)承受能力是高還是低 228 8.3.2 該語言與 Java 的互操作性如何 228 8.3.3 這門語言是否有良好的工具和測試支持 229 8.3.4 這門語言有多難學(xué) 229 8.3.5 使用這門語言的開發(fā)者多嗎 229 8.4 JVM 對其他語言的支持 230 8.4.1 性能 230 8.4.2 非 Java 語言的運(yùn)行時(shí)環(huán)境 231 8.4.3 編譯器虛構(gòu) 231 小結(jié) 233 第9章 Kotlin 234 9.1 為什么使用 Kotlin 234 9.2 便利和簡潔 235 9.2.1 從少開始 235 9.2.2 變量 236 9.2.3 相等性 236 9.2.4 函數(shù) 237 9.2.5 集合 240 9.2.6 表達(dá)自己 242 9.3 對類和對象的不同看法 244 9.4 安全 250 9.4.1 空安全 250 9.4.2 智能轉(zhuǎn)型 251 9.5 并發(fā) 253 9.6 與 Java 的互操作性 256 小結(jié) 259 第 10章 Clojure:編程新視角 260 10.1 介紹 Clojure 261 10.1.1 在 Clojure 中實(shí)現(xiàn) Hello World 262 10.1.2 REPL 入門 264 10.1.3 犯錯(cuò) 265 10.1.4 學(xué)著去愛括號 268 10.2 尋找 Clojure:語法和語義 269 10.2.1 特殊形式訓(xùn)練營 269 10.2.2 列表、向量、映射和集合 271 10.2.3 算術(shù)、相等和其他操作 274 10.2.4 使用函數(shù) 275 10.2.5 Clojure 中的循環(huán) 278 10.2.6 讀取器宏和派發(fā)器 279 10.3 函數(shù)式編程和閉包 281 10.4 Clojure 序列 282 10.5 Clojure 和 Java 的互操作 287 10.5.1 從 Clojure 中調(diào)用 Java 288 10.5.2 Clojure 調(diào)用的本質(zhì) 288 10.5.3 Clojure 值的 Java 類型 289 10.5.4 使用 Clojure 代理 290 10.5.5 使用 REPL 進(jìn)行探索式編程 290 10.5.6 在 Java 中使用 Clojure 291 10.6 宏 292 小結(jié) 296 第四部分 構(gòu)建和運(yùn)行 Java 應(yīng)用 第 11章 構(gòu)建工具 Gradle 和 Maven 298 11.1 為什么構(gòu)建工具對優(yōu)秀的程序員至關(guān)重要 298 11.1.1 自動化煩瑣的操作 298 11.1.2 管理依賴 299 11.1.3 確保開發(fā)者間的一致性 302 11.2 Maven 303 11.2.1 構(gòu)建生命周期 303 11.2.2 命令 /POM 概述 304 11.2.3 構(gòu)建 305 11.2.4 控制清單文件 306 11.2.5 添加多語言支持 307 11.2.6 測試 310 11.2.7 依賴管理 313 11.2.8 評估 316 11.2.9 超越 Java 8 317 11.2.10 如何在 Maven 中使用不同版本的 JAR 318 11.2.11 Maven 與模塊 321 11.2.12 編寫 Maven 插件 324 11.3 Gradle 327 11.3.1 安裝 Gradle 327 11.3.2 任務(wù) 328 11.3.3 腳本 329 11.3.4 使用插件 330 11.3.5 構(gòu)建 331 11.3.6 避免工作 333 11.3.7 Gradle 中的依賴 334 11.3.8 增加對 Kotlin 的支持 338 11.3.9 測試 339 11.3.10 自動化靜態(tài)分析 340 11.3.11 超越 Java 8 341 11.3.12 通過 Gradle 使用模塊 341 11.3.13 定制化 347 小結(jié) 350 第 12章 在容器中運(yùn)行 Java 351 12.1 為什么容器對優(yōu)秀的 Java 程序員至關(guān)重要 351 12.1.1 操作系統(tǒng)、虛擬機(jī)、容器的區(qū)別與聯(lián)系 351 12.1.2 容器的優(yōu)勢 353 12.1.3 容器的缺點(diǎn) 354 12.2 容器基礎(chǔ) 355 12.2.1 構(gòu)建容器鏡像 355 12.2.2 運(yùn)行 Docker 容器 358 12.3 使用 Docker 開發(fā) Java 應(yīng)用程序 360 12.3.1 選擇基礎(chǔ)鏡像 360 12.3.2 使用 Gradle 構(gòu)建鏡像 361 12.3.3 在容器中執(zhí)行構(gòu)建 362 12.3.4 端口與主機(jī) 364 12.3.5 使用 Docker Compose 進(jìn)行本地開發(fā) 366 12.3.6 在容器中調(diào)試 369 12.3.7 容器中的日志 371 12.4 Kubernetes 372 12.5 可觀測性與性能 379 12.5.1 可觀測性 379 12.5.2 容器中的性能 381 小結(jié) 382 第 13章 測試基礎(chǔ) 383 13.1 為什么要測試 383 13.2 如何開展測試 384 13.3 測試驅(qū)動開發(fā) 386 13.3.1 TDD 概述 387 13.3.2 一個(gè)單一用例的 TDD 示例 388 13.4 測試替身 393 13.4.1 Dummy 對象 394 13.4.2 Stub 對象 396 13.4.3 Fake 對象 398 13.4.4 Mock 對象 400 13.4.5 Mock 的問題 401 13.5 從 JUnit 4 到 JUnit 5 402 小結(jié) 408 第 14章 測試不止 JUnit 409 14.1 使用 Testcontainers 進(jìn)行集成測試 409 14.1.1 安裝 testcontainers 庫 409 14.1.2 Redis 示例 410 14.1.3 收集容器的日志 413 14.1.4 Postgres 示例 414 14.1.5 使用 Selenium 進(jìn)行端到端測試的示例 416 14.2 利用 Spek 和 Kotlin 規(guī)范測試風(fēng)格 418 14.3 使用 Clojure 進(jìn)行基于屬性的測試 423 14.3.1 clojure.test 423 14.3.2 closure.spec 425 14.3.3 test.check 428 14.3.4 clojure.spec 和test.check 433 小結(jié) 434 第五部分 Java世界的前沿展望 第 15章 高級函數(shù)式編程 436 15.1 函數(shù)式編程的概念 436 15.1.1 純函數(shù) 437 15.1.2 不可變性 437 15.1.3 高階函數(shù) 437 15.1.4 遞歸 438 15.1.5 閉包 438 15.1.6 惰性求值 439 15.1.7 柯里化與部分執(zhí)行 439 15.2 Java 作為一門函數(shù)式語言的局限性 440 15.2.1 純函數(shù) 440 15.2.2 可變性 441 15.2.3 高階函數(shù) 443 15.2.4 遞歸 444 15.2.5 閉包 447 15.2.6 惰性求值 448 15.2.7 柯里化與部分執(zhí)行 450 15.2.8 Java 的類型系統(tǒng)與集合類型 450 15.3 Kotlin 中的函數(shù)式編程 452 15.3.1 純函數(shù)及高階函數(shù) 452 15.3.2 閉包 453 15.3.3 柯里化與部分執(zhí)行 454 15.3.4 不可變性 455 15.3.5 尾遞歸 458 15.3.6 惰性求值 461 15.3.7 序列 462 15.4 Clojure 的函數(shù)式編程 466 15.4.1 推導(dǎo)式 466 15.4.2 惰性序列 467 15.4.3 Clojure 中的柯里化 469 小結(jié) 470 第 16章 高級并發(fā)程序設(shè)計(jì) 471 16.1 Fork/Join 框架 471 16.1.1 一個(gè)簡單的 Fork/Join應(yīng)用示例 472 16.1.2 通過 Fork/Join 框架將問題處理并行化 475 16.1.3 工作竊取算法 476 16.2 并發(fā)與函數(shù)式編程 477 16.2.1 回顧 CompletableFuture 477 16.2.2 并行流 481 16.3 深入了解 Kotlin 協(xié)程的實(shí)現(xiàn)原理 482 16.3.1 協(xié)程的工作原理 482 16.3.2 協(xié)程的作用域及調(diào)度 487 16.4 Clojure 中的并發(fā)實(shí)踐 489 16.4.1 持久化數(shù)據(jù)結(jié)構(gòu) 490 16.4.2 Future 和 pcall 495 16.4.3 軟件事務(wù)內(nèi)存 497 16.4.4 代理 500 小結(jié) 501 第 17章 現(xiàn)代內(nèi)核 503 17.1 JVM 內(nèi)核概述 503 17.1.1 調(diào)用虛方法 504 17.1.2 調(diào)用接口方法 507 17.1.3 調(diào)用“特殊”方法 508 17.1.4 final 方法 509 17.2 反射的內(nèi)部機(jī)制 510 17.3 方法句柄 514 17.3.1 MethodHandle 514 17.3.2 MethodType 516 17.3.3 查找方法句柄 516 17.3.4 反射、代理和方法句柄 517 17.4 動態(tài)調(diào)用 519 17.5 JVM 內(nèi)核的最新變化 523 17.5.1 字符串連接 523 17.5.2 壓縮字符串 525 17.5.3 Nestmates 527 17.6 Unsafe 類 529 17.7 用支持的 API 替換 Unsafe 533 17.7.1 VarHandles 534 17.7.2 隱藏類 535 小結(jié) 537 第 18章 Java 的未來 538 18.1 項(xiàng)目 Amber 538 18.2 項(xiàng)目 Panama 540 18.3 項(xiàng)目 Loom 546 18.3.1 虛擬線程 549 18.3.2 線程構(gòu)建器 550 18.3.3 使用虛擬線程編程 551 18.3.4 項(xiàng)目 Loom 什么時(shí)候發(fā)布 552 18.4 項(xiàng)目 Valhalla 553 18.4.1 改變語言模型 556 18.4.2 值對象帶來的影響 557 18.4.3 回顧泛型 559 18.5 Java 18 559 小結(jié) 560 附錄A 選擇 Java 版本 561 附錄B 回顧 Java 8 中的流 564
你還可能感興趣
我要評論
|