# [前言](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e5%89%8d%e8%a8%80)
> 本書基于 Java 8 版本來教授當前 Java 編程的最優實踐。
我之前的 Java 書籍*Thinking in Java, 4th Edition*(《Java編程思想 (第4版)》 Prentice Hall 2006)依然適用于 Java 5 編程,在此版本 Java 語言開始用作 Android 編程。此后,這門語言的許多地方發生了翻天覆地的變化,特別是 Java 8 的轉變,以至于新的 Java 代碼讀起來的感覺也不盡相同。這也促使我時隔多年,創作了這本新書。
《On Java 8》旨在面向已具有編程基礎的開發者們。對于初學者,可以先在[Code.org](http://code.org/)或者[Khan Academy](https://www.khanacademy.org/computing/computer-programming)等網站補充必要的前置知識。同時,[OnJava8.com](http://www.onjava8.com/)上也有免費的 Thinking in C(《C編程思想》)專題知識。與幾年前我們依賴印刷媒體時相比,像 YouTube、博客和 StackOverFlow 這樣的網站使得尋找答案變得非常簡單。如果將本書作為編程入門書籍,請結合這些學習途徑努力堅持下去。同時,本書也適合想要擴展知識的在職程序員。
得益于《*Thinking in Java*》,我得以到世界各地演講,我對此由衷感激。它為我的[Reinventing Business](http://www.reinventing-business.com/)項目在與人員及公司建立聯系方面提供了寶貴的幫助。我最終撰寫本書的原因之一就是想支持這一項目的研究,而下一個合乎邏輯的步驟似乎是實際創建一個所謂的藍綠色組織(Teal Organization)。我希望本書可以成為該項目的一種眾籌。
## [教學目標](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e6%95%99%e5%ad%a6%e7%9b%ae%e6%a0%87)
每章教授一個或一組相關的概念,并且這些知識不依賴于尚未學習到的章節。如此,學習者可以在當前知識的背景框架下循序漸進地掌握 Java。
本書的教學目標:
1. 循序漸進地呈現學習內容,以便于你在不依賴后置知識框架的情況下輕松完成現有的學習任務,同時盡量保證前面章節的內容在后面的學習中得到運用。如果確有必要引入我們還沒學習到的知識概念,我會做個簡短地介紹。
2. 盡可能地使用簡單和簡短的示例,方便讀者理解。而不強求引入解決實際問題的例子。因為我發現,相比解決某個實際問題,讀者更樂于看到自己真正理解了示例的每個細節。或許我會因為這些“玩具示例”而被一些人所詬病,但我更愿意看到我的讀者們因此能保持饒有興趣地學習。
3. 把我知道以及我認為對于你學習語言很重要的東西都告訴你。我認為信息的重要性是分層次結構的。絕大多數情況下,我們沒必要弄清問題的所有本質。好比編程語言中的某些特性和實現細節,95% 的程序員都不需要去知道。這些細節除了會加重你的學習成本,還讓你更覺得這門語言好復雜。如果你非要考慮這些細節,那么它還會迷惑該代碼的閱讀者/維護者,所以我主張選擇簡單的方法解決問題。
4. 希望本書能為你打下堅實的基礎,方便你將來學習更難的課程和書籍。
## [語言設計錯誤](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e8%af%ad%e8%a8%80%e8%ae%be%e8%ae%a1%e9%94%99%e8%af%af)
每種語言都有設計錯誤。當新手程序員涉足語言特性并猜測應用場景和使用方式時,他們體驗到極大的不確定性和挫折感。承認錯誤令人尷尬,但這種糟糕的初學者經歷比認識到你錯在哪里還要糟糕。唉,每一種語言/庫的設計錯誤都會永久地嵌入在 Java 的發行版中。
諾貝爾經濟學獎得主約瑟夫·斯蒂格利茨(*Joseph Stiglitz*)有一套適用于這里的人生哲學,叫做“承諾升級理論”:繼續犯錯誤的成本由別人承擔,而承認錯誤的成本由自己承擔。
看過我此前作品的讀者們應該清楚,我一般傾向于指出這些錯誤。Java 擁有一批狂熱的粉絲。他們把語言當成是陣營而不是純粹的編程工具。我寫過 Java 書籍,所以他們兀自認為我自然也是這個“陣營”的一份子。當我指出 Java 的這些錯誤時,會造成兩種影響:
1. 早先許多錯誤“陣營”的人成為了犧牲品。最終,時隔多年后,大家都意識到這是個設計上的錯誤。然而錯誤已然成為 Java 歷史的一部分了。
2. 更重要的是,新手程序員并沒有經歷過“語言為何采用某種方式實現”的爭議過程。特別是那些隱約察覺不對卻依然說服自己“我必須要這么做”或“我只是沒學明白”從而繼續錯下去的人。更糟糕的是,教授這些編程知識的老師們沒能深入地去研究這里是否有設計上的錯誤,而是繼續錯誤的解讀。總之,通過了解語言設計上的錯誤,能讓開發者們更好地理解和意識到錯誤的本質,從而更快地進步。
對編程語言的設計錯誤理解至關重要,甚至影響程序員的開發效率。部分公司在開發過程中避免使用語言的某些功能特性。這些功能特性表面上看起來高大上,但是弄不好卻可能出現意料之外的錯誤,影響整個開發進程。
已知的語言設計錯誤會給新的一門編程語言的作者提供參考。探索一門語言能做什么是很有趣的一件事,而語言設計錯誤能提醒你哪些“坑”是不能再趟的。多年以來,我一直感覺 Java 的設計者們有點脫離群眾。Java 的有些設計錯誤錯的太明顯,我甚至懷疑設計者們到底是為出于服務用戶還是其他動機設計了這些功能。Java 語言有許多臭名昭著的設計錯誤,很可能這也是誘惑所在。Java 似乎并不尊重開發者。為此我很長時間內不想與 Java 有任何瓜葛。很大程度上,這也是我不想碰 Java 的原因吧。
如今再審視 Java 8,我發現了許多變化。設計者們對于語言和用戶的態度似乎發生了根本性上的改變。忽視用戶投訴多年之后,Java 的許多功能和類庫都已被搞砸了。
新功能的設計與以往有很大不同。掌舵者開始重視程序員的編程經驗。新功能的開發都是在努力使語言變得更好,而非僅僅停留在快速堆砌功能而不去深入研究它們的含義。甚至有些新特性的實現方式非常優雅(至少在 Java 約束下盡可能優雅)。
我猜測可能是部分設計者的離開讓他們意識到了這點。說真的,我沒想到會有這些變化!因為這些原因,寫這本書的體驗要比以往好很多。Java 8 包含了一系列基礎和重要的改進。遺憾的是,為了嚴格地“向后兼容”,我們不大可能看到戲劇性的變化,當然我希望我是錯的。盡管如此,我很贊賞那些敢于自我顛覆,并為 Java 設定更好路線的人。第一次,對于自己所寫的部分 Java 8 代碼我終于可以說“贊!”
最后,本書所著時間似乎也還不錯,因為 Java 8 引入的新功能已經強烈地影響了今后 Java 的編碼方式。截止我在寫這本書時,Java 9 似乎更專注于對語言底層的基礎結構功能的重要更新,而非本書所關注的新編碼方式。話說回來,得益于電子書出版形式的便捷,假如我發現本書有需要更新或添加的內容,我可以第一時間將新版本推送給現有讀者。
## [測試用例](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e6%b5%8b%e8%af%95%e7%94%a8%e4%be%8b)
書中代碼示例基于 Java 8 和 Gradle 編譯構建,并且代碼示例都保存在[這個自由訪問的GitHub的倉庫](https://github.com/BruceEckel/OnJava8-Examples)中。我們需要內置的測試框架,以便于在每次構建系統時自動運行。否則,你將無法保證自己代碼的可靠性。為了實現這一點,我創建了一個測試系統來顯示和驗證大多數示例的輸出結果。這些輸出結果我會附加在示例結尾的代碼塊中。有時僅顯示必要的那幾行或者首尾行。利用這種方式來改善讀者的閱讀和學習體驗,同時也提供了一種驗證示例正確性的方法。
## [普及性](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e6%99%ae%e5%8f%8a%e6%80%a7)
Java 的普及性對于其受歡迎程度有重要意義。學習 Java 會讓你更容易找到工作。相關的培訓材料,課程和其他可用的學習資源也很多。對于企業來說,招聘 Java 程序員相對容易。如果你不喜歡 Java 語言,那么最好不要拿他當作你謀生的工具,因為這種生活體驗并不好。作為一家公司,在技術選型前一定不要單單只考慮 Java 程序員好招。每種語言都有其適用的范圍,有可能你們的業務更適用于另一種編程語言來達到事半功倍的效果。如果你真的喜歡 Java,那么歡迎你。希望這本書能豐富你的編程經驗!
## [關于安卓](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e5%85%b3%e4%ba%8e%e5%ae%89%e5%8d%93)
本書基于 Java 8 版本。如果你是 Andriod 程序員,請務必學習 Java 5。在《On Java 8》出版的時候,我的另一本基于 Java 5 的著作*Thinking in Java 4th Edition*(《Java編程思想》第四版)已經可以在[www.OnJava8.com](http://www.onjava8.com/)上免費下載了。此外,還有許多其他專用于 Andriod 編程的資源。
## [電子版權聲明](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e7%94%b5%e5%ad%90%e7%89%88%e6%9d%83%e5%a3%b0%e6%98%8e)
《On Java 8》僅提供電子版,并且僅通過[www.OnJava8.com](http://www.onjava8.com/)提供。任何未經[mindviewinc@gmail.com](mailto:mindviewinc@gmail.com)授權的其他來源或流傳送機構都是非法的。本作品受版權保護!未經許可,請勿通過以任何方式分享或發布。你可以使用這些示例進行教學,只要不對本書非法重新出版。有關完整詳細信息,請參閱示例分發中的 Copyright.txt 文件。對于視覺障礙者,電子版本有可搜索性,字體大小調整或文本到語音等諸多好處。
任何購買這本書的讀者,還需要一臺計算機來運行和寫作代碼。另外電子版在計算機上和移動設備上的顯示效果俱佳,推薦使用平板設備閱讀。相比購買傳統紙質版的價格,平板電腦價格都足夠便宜。在床上閱讀電子版比看這樣一本厚厚的實體書要方便得多。起初你可能會有些不習慣,但我相信很快你就會發現它帶來的優點遠勝過不適。我已經走過這個階段,Google Play 圖書的瀏覽器閱讀體驗非常好,包括在 Linux 和 iOS 設備上。作為一次嘗試,我決定嘗試通過 Google 圖書進行出版。
**注意**:在撰寫本文時,通過 Google Play 圖書網絡瀏覽器應用閱讀圖書雖然可以忍受,但體驗還是有點差強人意,我強烈推薦讀者們使用平板電腦來閱讀。
## [版本說明](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e7%89%88%e6%9c%ac%e8%af%b4%e6%98%8e)
本書采用[Pandoc](http://pandoc.org/)風格的 Markdown 編寫,使用 Pandoc 生成 ePub v3 格式。
正文字體為 Georgia,標題字體為 Verdana。 代碼字體使用的 Ubuntu Mono,因為它特別緊湊,單行能容納更多的代碼。 我選擇將代碼內聯(而不是將列表放入圖像,參照其他書籍),因為我覺得這個功能很重要:讓代碼塊能適應字體大小得改變而改變(否則,買電子版,還圖什么呢?)。
書中的提取,編譯和測試代碼示例的構建過程都是自動化的。所有自動化操作都是通過我在 Python 3 中編寫的程序來實現的。
## [封面設計](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e5%b0%81%e9%9d%a2%e8%ae%be%e8%ae%a1)
《On Java 8》的封面是根據 W.P.A.(Works Progress Administration 1935年至1943年美國大蕭條期間的一個巨大項目,它使數百萬失業人員重新就業)的馬賽克創作的。它還讓我想起了《綠野仙蹤》(*The Wizard of Oz*)系列叢書中的插圖。 我的好朋友、設計師丹*Daniel Will-Harris*([www.will-harris.com](http://www.will-harris.com/))和我都喜歡這個形象。
## [感謝的人](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e6%84%9f%e8%b0%a2%e7%9a%84%e4%ba%ba)
感謝*Domain-Driven Design*(《領域驅動設計》 )的作者*Eric Evans*建議書名,以及其他新聞組校對的幫助。
感謝*James Ward*為我開始使用 Gradle 工具構建這本書,以及他多年來的幫助和友誼。
感謝*Ben Muschko*在整理構建文件方面的工作,還有感謝*Hans Dockter*給*Ben*提供了時間。
感謝*Jeremy Cerise*和*Bill Frasure*來到開發商務聚會預訂,并隨后提供了寶貴的幫助。
感謝所有花時間和精力來科羅拉多州克雷斯特德比特(Crested Butte, Colorado)鎮參加我的研討會,開發商務聚會和其他活動的人!你們的貢獻可能不容易看到,但卻非常重要!
## [獻禮](https://lingcoder.gitee.io/onjava8/#/book/00-Preface?id=%e7%8c%ae%e7%a4%bc)
> 謹以此書獻給我敬愛的父親 E. Wayne Eckel。 1924年4月1日至2016年11月23日
- 譯者的話
- 前言
- 簡介
- 第一章 對象的概念
- 抽象
- 接口
- 服務提供
- 封裝
- 復用
- 繼承
- "是一個"與"像是一個"的關系
- 多態
- 單繼承結構
- 集合
- 對象創建與生命周期
- 異常處理
- 本章小結
- 第二章 安裝Java和本書用例
- 編輯器
- Shell
- Java安裝
- 校驗安裝
- 安裝和運行代碼示例
- 第三章 萬物皆對象
- 對象操縱
- 對象創建
- 數據存儲
- 基本類型的存儲
- 高精度數值
- 數組的存儲
- 代碼注釋
- 對象清理
- 作用域
- 對象作用域
- 類的創建
- 類型
- 字段
- 基本類型默認值
- 方法使用
- 返回類型
- 參數列表
- 程序編寫
- 命名可見性
- 使用其他組件
- static關鍵字
- 小試牛刀
- 編譯和運行
- 編碼風格
- 本章小結
- 第四章 運算符
- 開始使用
- 優先級
- 賦值
- 方法調用中的別名現象
- 算術運算符
- 一元加減運算符
- 遞增和遞減
- 關系運算符
- 測試對象等價
- 邏輯運算符
- 短路
- 字面值常量
- 下劃線
- 指數計數法
- 位運算符
- 移位運算符
- 三元運算符
- 字符串運算符
- 常見陷阱
- 類型轉換
- 截斷和舍入
- 類型提升
- Java沒有sizeof
- 運算符總結
- 本章小結
- 第五章 控制流
- true和false
- if-else
- 迭代語句
- while
- do-while
- for
- 逗號操作符
- for-in 語法
- return
- break 和 continue
- 臭名昭著的 goto
- switch
- switch 字符串
- 本章小結
- 第六章 初始化和清理
- 利用構造器保證初始化
- 方法重載
- 區分重載方法
- 重載與基本類型
- 返回值的重載
- 無參構造器
- this關鍵字
- 在構造器中調用構造器
- static 的含義
- 垃圾回收器
- finalize()的用途
- 你必須實施清理
- 終結條件
- 垃圾回收器如何工作
- 成員初始化
- 指定初始化
- 構造器初始化
- 初始化的順序
- 靜態數據的初始化
- 顯式的靜態初始化
- 非靜態實例初始化
- 數組初始化
- 動態數組創建
- 可變參數列表
- 枚舉類型
- 本章小結
- 第七章 封裝
- 包的概念
- 代碼組織
- 創建獨一無二的包名
- 沖突
- 定制工具庫
- 使用 import 改變行為
- 使用包的忠告
- 訪問權限修飾符
- 包訪問權限
- public: 接口訪問權限
- 默認包
- private: 你無法訪問
- protected: 繼承訪問權限
- 包訪問權限 Vs Public 構造器
- 接口和實現
- 類訪問權限
- 本章小結
- 第八章 復用
- 組合語法
- 繼承語法
- 初始化基類
- 帶參數的構造函數
- 委托
- 結合組合與繼承
- 保證適當的清理
- 名稱隱藏
- 組合與繼承的選擇
- protected
- 向上轉型
- 再論組合和繼承
- final關鍵字
- final 數據
- 空白 final
- final 參數
- final 方法
- final 和 private
- final 類
- final 忠告
- 類初始化和加載
- 繼承和初始化
- 本章小結
- 第九章 多態
- 向上轉型回顧
- 忘掉對象類型
- 轉機
- 方法調用綁定
- 產生正確的行為
- 可擴展性
- 陷阱:“重寫”私有方法
- 陷阱:屬性與靜態方法
- 構造器和多態
- 構造器調用順序
- 繼承和清理
- 構造器內部多態方法的行為
- 協變返回類型
- 使用繼承設計
- 替代 vs 擴展
- 向下轉型與運行時類型信息
- 本章小結
- 第十章 接口
- 抽象類和方法
- 接口創建
- 默認方法
- 多繼承
- 接口中的靜態方法
- Instrument 作為接口
- 抽象類和接口
- 完全解耦
- 多接口結合
- 使用繼承擴展接口
- 結合接口時的命名沖突
- 接口適配
- 接口字段
- 初始化接口中的字段
- 接口嵌套
- 接口和工廠方法模式
- 本章小結
- 第十一章 內部類
- 創建內部類
- 鏈接外部類
- 使用 .this 和 .new
- 內部類與向上轉型
- 內部類方法和作用域
- 匿名內部類
- 嵌套類
- 接口內部的類
- 從多層嵌套類中訪問外部類的成員
- 為什么需要內部類
- 閉包與回調
- 內部類與控制框架
- 繼承內部類
- 內部類可以被覆蓋么?
- 局部內部類
- 內部類標識符
- 本章小結
- 第十二章 集合
- 泛型和類型安全的集合
- 基本概念
- 添加元素組
- 集合的打印
- 迭代器Iterators
- ListIterator
- 鏈表LinkedList
- 堆棧Stack
- 集合Set
- 映射Map
- 隊列Queue
- 優先級隊列PriorityQueue
- 集合與迭代器
- for-in和迭代器
- 適配器方法慣用法
- 本章小結
- 簡單集合分類
- 第十三章 函數式編程
- 新舊對比
- Lambda表達式
- 遞歸
- 方法引用
- Runnable接口
- 未綁定的方法引用
- 構造函數引用
- 函數式接口
- 多參數函數式接口
- 缺少基本類型的函數
- 高階函數
- 閉包
- 作為閉包的內部類
- 函數組合
- 柯里化和部分求值
- 純函數式編程
- 本章小結
- 第十四章 流式編程
- 流支持
- 流創建
- 隨機數流
- int 類型的范圍
- generate()
- iterate()
- 流的建造者模式
- Arrays
- 正則表達式
- 中間操作
- 跟蹤和調試
- 流元素排序
- 移除元素
- 應用函數到元素
- 在map()中組合流
- Optional類
- 便利函數
- 創建 Optional
- Optional 對象操作
- Optional 流
- 終端操作
- 數組
- 集合
- 組合
- 匹配
- 查找
- 信息
- 數字流信息
- 本章小結
- 第十五章 異常
- 異常概念
- 基本異常
- 異常參數
- 異常捕獲
- try 語句塊
- 異常處理程序
- 終止與恢復
- 自定義異常
- 異常與記錄日志
- 異常聲明
- 捕獲所有異常
- 多重捕獲
- 棧軌跡
- 重新拋出異常
- 精準的重新拋出異常
- 異常鏈
- Java 標準異常
- 特例:RuntimeException
- 使用 finally 進行清理
- finally 用來做什么?
- 在 return 中使用 finally
- 缺憾:異常丟失
- 異常限制
- 構造器
- Try-With-Resources 用法
- 揭示細節
- 異常匹配
- 其他可選方式
- 歷史
- 觀點
- 把異常傳遞給控制臺
- 把“被檢查的異常”轉換為“不檢查的異常”
- 異常指南
- 本章小結
- 后記:Exception Bizarro World
- 第十六章 代碼校驗
- 測試
- 如果沒有測試過,它就是不能工作的
- 單元測試
- JUnit
- 測試覆蓋率的幻覺
- 前置條件
- 斷言(Assertions)
- Java 斷言語法
- Guava斷言
- 使用斷言進行契約式設計
- 檢查指令
- 前置條件
- 后置條件
- 不變性
- 放松 DbC 檢查或非嚴格的 DbC
- DbC + 單元測試
- 使用Guava前置條件
- 測試驅動開發
- 測試驅動 vs. 測試優先
- 日志
- 日志會給出正在運行的程序的各種信息
- 日志等級
- 調試
- 使用 JDB 調試
- 圖形化調試器
- 基準測試
- 微基準測試
- JMH 的引入
- 剖析和優化
- 優化準則
- 風格檢測
- 靜態錯誤分析
- 代碼重審
- 結對編程
- 重構
- 重構基石
- 持續集成
- 本章小結
- 第十七章 文件
- 文件和目錄路徑
- 選取路徑部分片段
- 路徑分析
- Paths的增減修改
- 目錄
- 文件系統
- 路徑監聽
- 文件查找
- 文件讀寫
- 本章小結
- 第十八章 字符串
- 字符串的不可變
- +的重載與StringBuilder
- 意外遞歸
- 字符串操作
- 格式化輸出
- printf()
- System.out.format()
- Formatter類
- 格式化修飾符
- Formatter轉換
- String.format()
- 一個十六進制轉儲(dump)工具
- 正則表達式
- 基礎
- 創建正則表達式
- 量詞
- CharSequence
- Pattern和Matcher
- find()
- 組(Groups)
- start()和end()
- Pattern標記
- split()
- 替換操作
- 正則表達式與 Java I/O
- 掃描輸入
- Scanner分隔符
- 用正則表達式掃描
- StringTokenizer類
- 本章小結
- 第十九章 類型信息
- 為什么需要 RTTI
- Class對象
- 類字面常量
- 泛化的Class引用
- cast()方法
- 類型轉換檢測
- 使用類字面量
- 遞歸計數
- 一個動態instanceof函數
- 注冊工廠
- 類的等價比較
- 反射:運行時類信息
- 類方法提取器
- 動態代理
- Optional類
- 標記接口
- Mock 對象和樁
- 接口和類型
- 本章小結
- 第二十章 泛型
- 簡單泛型
- 泛型接口
- 泛型方法
- 復雜模型構建
- 泛型擦除
- 補償擦除
- 邊界
- 通配符
- 問題
- 自限定的類型
- 動態類型安全
- 泛型異常
- 混型
- 潛在類型機制
- 對缺乏潛在類型機制的補償
- Java8 中的輔助潛在類型
- 總結:類型轉換真的如此之糟嗎?
- 進階閱讀
- 第二十一章 數組
- 數組特性
- 一等對象
- 返回數組
- 多維數組
- 泛型數組
- Arrays的fill方法
- Arrays的setAll方法
- 增量生成
- 隨機生成
- 泛型和基本數組
- 數組元素修改
- 數組并行
- Arrays工具類
- 數組比較
- 數組拷貝
- 流和數組
- 數組排序
- Arrays.sort()的使用
- 并行排序
- binarySearch二分查找
- parallelPrefix并行前綴
- 本章小結
- 第二十二章 枚舉
- 基本 enum 特性
- 將靜態類型導入用于 enum
- 方法添加
- 覆蓋 enum 的方法
- switch 語句中的 enum
- values 方法的神秘之處
- 實現而非繼承
- 隨機選擇
- 使用接口組織枚舉
- 使用 EnumSet 替代 Flags
- 使用 EnumMap
- 常量特定方法
- 使用 enum 的職責鏈
- 使用 enum 的狀態機
- 多路分發
- 使用 enum 分發
- 使用常量相關的方法
- 使用 EnumMap 進行分發
- 使用二維數組
- 本章小結
- 第二十三章 注解
- 基本語法
- 定義注解
- 元注解
- 編寫注解處理器
- 注解元素
- 默認值限制
- 替代方案
- 注解不支持繼承
- 實現處理器
- 使用javac處理注解
- 最簡單的處理器
- 更復雜的處理器
- 基于注解的單元測試
- 在 @Unit 中使用泛型
- 實現 @Unit
- 本章小結
- 第二十四章 并發編程
- 術語問題
- 并發的新定義
- 并發的超能力
- 并發為速度而生
- 四句格言
- 1.不要這樣做
- 2.沒有什么是真的,一切可能都有問題
- 3.它起作用,并不意味著它沒有問題
- 4.你必須仍然理解
- 殘酷的真相
- 本章其余部分
- 并行流
- 創建和運行任務
- 終止耗時任務
- CompletableFuture類
- 基本用法
- 結合 CompletableFuture
- 模擬
- 異常
- 流異常(Stream Exception)
- 檢查性異常
- 死鎖
- 構造方法非線程安全
- 復雜性和代價
- 本章小結
- 缺點
- 共享內存陷阱
- This Albatross is Big
- 其他類庫
- 考慮為并發設計的語言
- 拓展閱讀
- 第二十五章 設計模式
- 概念
- 單例模式
- 模式分類
- 構建應用程序框架
- 面向實現
- 工廠模式
- 動態工廠
- 多態工廠
- 抽象工廠
- 函數對象
- 命令模式
- 策略模式
- 責任鏈模式
- 改變接口
- 適配器模式(Adapter)
- 外觀模式(Fa?ade)
- 包(Package)作為外觀模式的變體
- 解釋器:運行時的彈性
- 回調
- 多次調度
- 模式重構
- 抽象用法
- 多次派遣
- 訪問者模式
- RTTI的優劣
- 本章小結
- 附錄:補充
- 附錄:編程指南
- 附錄:文檔注釋
- 附錄:對象傳遞和返回
- 附錄:流式IO
- 輸入流類型
- 輸出流類型
- 添加屬性和有用的接口
- 通過FilterInputStream 從 InputStream 讀取
- 通過 FilterOutputStream 向 OutputStream 寫入
- Reader和Writer
- 數據的來源和去處
- 更改流的行為
- 未發生改變的類
- RandomAccessFile類
- IO流典型用途
- 緩沖輸入文件
- 從內存輸入
- 格式化內存輸入
- 基本文件的輸出
- 文本文件輸出快捷方式
- 存儲和恢復數據
- 讀寫隨機訪問文件
- 本章小結
- 附錄:標準IO
- 附錄:新IO
- ByteBuffer
- 數據轉換
- 基本類型獲取
- 視圖緩沖區
- 字節存儲次序
- 緩沖區數據操作
- 緩沖區細節
- 內存映射文件
- 性能
- 文件鎖定
- 映射文件的部分鎖定
- 附錄:理解equals和hashCode方法
- 附錄:集合主題
- 附錄:并發底層原理
- 附錄:數據壓縮
- 附錄:對象序列化
- 附錄:靜態語言類型檢查
- 附錄:C++和Java的優良傳統
- 附錄:成為一名程序員