# [簡介](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=%e7%ae%80%e4%bb%8b)
> “我的語言極限,即是我的世界的極限。” ——路德維希·維特根斯坦(*Wittgenstein*)
這句話無論對于自然語言還是編程語言來說都是一樣的。你所使用的編程語言會將你的思維模式固化并逐漸遠離其他語言,而且往往發生在潛移默化中。Java 作為一門傲嬌的語言尤其如此。
Java 是一門派生語言,早期語言設計者為了不想在項目中使用 C++ 而創造了這種看起來很像 C++,卻比 C++ 有了改進的新語言(原始的項目并未成功)。Java 最核心的變化就是加入了“虛擬機”和“垃圾回收機制”,這兩個概念在之后的章節會有詳細描述。 此外,Java 還在其他方面推動了行業發展。例如,現在絕大多數編程語言都支持文檔注釋語法和 HTML 文檔生成工具。
Java 最主要的概念之一“對象”來自 SmallTalk 語言。SmallTalk 語言恪守“對象”(在下一章中描述)是編程的最基本單元。于是,萬物皆對象。歷經時間的檢驗,人們發現這種信念太過狂熱。有些人甚至認為“對象”的概念是完全錯誤的,應該舍棄。就我個人而言,把一切事物都抽象成對象不僅是一項不必要的負擔,同時還會招致許多設計朝著不好的方向發展。盡管如此,“對象”的概念依然有其閃光點。固執地要求所有東西都是一個對象(特別是一直到最底層級別)是一種設計錯誤;相反,完全逃避“對象”的概念似乎同樣太過苛刻。
Java 語言曾規劃設計的許多功能并未按照承諾兌現。本書中,我將嘗試解釋這些原因,力爭讓讀者知曉這些功能,并明白為什么這些功能最終并不適用。這無關 Java 是一種好語言或者壞語言,一旦你了解了該語言的缺陷和局限性,你就能夠:
1. 明白有些功能特性為什么會被“廢棄”。
2. 熟悉語言邊界,更好地設計和編碼。
編程的過程就是復雜性管理的過程:業務問題的復雜性,以及依賴的計算機的復雜性。由于這種復雜性,我們的大多數軟件項目都失敗了。
許多語言設計決策時都考慮到了復雜性,并試圖降低語言的復雜性,但在設計過程中遇到了一些更棘手的問題,最終導致語言設計不可避免地“碰壁”,復雜性增加。例如,C++ 必須向后兼容 C(允許 C 程序員輕松遷移),并且效率很高。這些目標非常實用,并且也是 C++ 在編程界取得了成功的原因之一,但同時也引入了額外的復雜性,導致某些用 C++ 編寫的項目開發失敗。當然,你可以責怪程序員和管理人員手藝不精,但如果有一種編程語言可以幫助你在開發過程中發現錯誤,那豈不是更好?
雖然 VB(Visual BASIC)綁定在 BASIC 上,但 BASIC 實際上并不是一種可擴展的語言。大量擴展的堆積造成 VB 的語法難以維護。Perl 向后兼容 awk、sed、grep 以及其它要替換的 Unix 工具。因此它常常被詬病產生了一堆“只寫代碼”(*write-only code*,寫代碼的人自己都看不懂的代碼)。另一方面,C ++,VB,Perl 和其他語言(如 SmallTalk)在設計時重點放在了對某些復雜問題的處理上,因而在解決這些特定類型的問題方面非常成功。
通信革命使我們相互溝通更加便利。無論是一對一溝通,還是團隊里的互相溝通,甚至是地球上不同地區的溝通。據說下一次革命需要的是一種全球性的思維,這種思維源于足量的人以及足量相互連接。我不知道 Java 是否能成為這場革命的工具之一,但至少這種可能性讓我覺得:我現在正在做的傳道授業的事情是有意義的!
## [前提條件](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6)
閱讀本書需要讀者對編程有基本的了解:
* 程序是一系列“陳述(語句、代碼)”構成
* 子程序、方法、宏的概念
* 控制語句(例如**if**),循環結構(例如**while**)
可能你已在學校、書籍或網絡上學過這些。只要你覺得對上述的編程基本概念熟悉,你就可以完成本書的學習。
你可以通過在 On Java 8 的網站上免費下載 《Think in C》來補充學習 Java 所需要的前置知識。本書介紹了 Java 語言的基本控制機制以及面向對象編程(OOP)的概念。在本書中我引述了一些 C/C++ 語言中的一些特性來幫助讀者更好的理解 Java。畢竟 Java 是在它們的基礎之上發明的,理解他們之間的區別,有助于讀者更好地學習 Java。我會試圖簡化這些引述,盡量讓沒有 C/C++ 基礎的讀者也能很好地理解。
## [JDK文檔](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=jdk%e6%96%87%e6%a1%a3)
甲骨文公司已經提供了免費的標準 JDK 文檔。除非有必要,否則本書中將不再贅述 API 相關的使用細節。使用瀏覽器來即時搜索最新最全的 JDK 文檔好過翻閱本書來查找。只有在需要補充特定的示例時,我才會提供有關的額外描述。
## [C編程思想](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=c%e7%bc%96%e7%a8%8b%e6%80%9d%e6%83%b3)
*Thinking in C*已經可以在[www.OnJava8.com](https://archive.org/details/ThinkingInC)免費下載。Java 的基礎語法是基于 C 語言的。*Thinking in C*中有更適合初學者的編程基礎介紹。 我已經委托 Chuck Allison 將這本 C 基礎的書籍作為獨立產品附贈于本書的 CD 中。希望大家在閱讀本書時,都已具備了學習 Java 的良好基礎。
## [源碼下載](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=%e6%ba%90%e7%a0%81%e4%b8%8b%e8%bd%bd)
本書中所有源代碼的示例都在版權保護的前提下通過 GitHub 免費提供。你可以將這些代碼用于教育。任何人不得在未經正確引用代碼來源的情況下隨意重新發布此代碼示例。在每個代碼文件中,你都可以找到以下版權聲明文件作為參考:
**Copyright.txt**
?2017 MindView LLC。版權所有。如果上述版權聲明,本段和以下內容,特此授予免費使用,復制,修改和分發此計算機源代碼(源代碼)及其文檔的許可,且無需出于下述目的的書面協議所有副本中都有五個編號的段落。
1. 允許編譯源代碼并將編譯代碼僅以可執行格式包含在個人和商業軟件程序中。
2. 允許在課堂情況下使用源代碼而不修改源代碼,包括在演示材料中,前提是 “On Java 8” 一書被引用為原點。
3. 可以通過以下方式獲得將源代碼合并到印刷媒體中的許可:MindView LLC,PO Box 969,Crested Butte,CO 81224[MindViewInc@gmail.com](mailto:MindViewInc@gmail.com)
4. 源代碼和文檔的版權歸 MindView LLC 所有。提供的源代碼沒有任何明示或暗示的擔保,包括任何適銷性,適用于特定用途或不侵權的默示擔保。MindView LLC 不保證任何包含源代碼的程序的運行不會中斷或沒有錯誤。MindView LLC 不對任何目的的源代碼或包含源代碼的任何軟件的適用性做出任何陳述。包含源代碼的任何程序的質量和性能的全部風險來自源代碼的用戶。用戶理解源代碼是為研究和教學目的而開發的,建議不要僅僅因任何原因依賴源代碼或任何包含源代碼的程序。如果源代碼或任何產生的軟件證明有缺陷,則用戶承擔所有必要的維修,修理或更正的費用。
5. 在任何情況下,MINDVIEW LLC 或其出版商均不對任何一方根據任何法律理論對直接,間接,特殊,偶發或后果性損害承擔任何責任,包括利潤損失,業務中斷,商業信息丟失或任何其他保險公司。由于 MINDVIEW LLC 或其出版商已被告知此類損害的可能性,因此使用本源代碼及其文檔或因無法使用任何結果程序而導致的個人受傷或者個人受傷。MINDVIEW LLC 特別聲明不提供任何擔保,包括但不限于對適銷性和特定用途適用性的暗示擔保。此處提供的源代碼和文檔基于“原樣”基礎,沒有MINDVIEW LLC的任何隨附服務,MINDVIEW LLC 沒有義務提供維護,支持,更新,增強或修改。
**請注意**,MindView LLC 僅提供以下唯一網址發布更新書中的代碼示例,[https://github.com/BruceEckel/OnJava8-examples](https://github.com/BruceEckel/OnJava8-examples)。你可在上述條款范圍內將示例免費使用于項目和課堂中。
如果你在源代碼中發現錯誤,請在下面的網址提交更正:[https://github.com/BruceEckel/OnJava8-examples/issues](https://github.com/BruceEckel/OnJava8-examples/issues)
## [編碼樣式](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=%e7%bc%96%e7%a0%81%e6%a0%b7%e5%bc%8f)
本書中代碼標識符(關鍵字,方法,變量和類名)以粗體,固定寬度代碼字體顯示。像 “\*class” 這種在代碼中高頻率出現的關鍵字可能讓你覺得粗體有點乏味。(譯者注:由于中英排版差異,中文翻譯過程并未完全參照原作者的說明。具體排版格式請參考[此處](https://github.com/ruanyf/document-style-guide))其他顯示為正常字體。本書文本格式盡可能遵循 Oracle 常見樣式,并保證在大多數 Java 開發環境中被支持。書中我使用了自己喜歡的字體風格。Java 是一種自由的編程語言,你也可以使用 IDE(集成開發環境)工具(如 IntelliJ IDEA,Eclipse 或 NetBeans)將格式更改為適合你的格式。
本書代碼文件使用自動化工具進行測試,并在最新版本的 Java 編譯通過(除了那些特別標記的錯誤之外)。本書重點介紹并使用 Java 8 進行測試。如果你必須了解更早的語言版本,可以在[www.OnJava8.com](http://www.onjava8.com/)免費下載 《Thinking in Java》。
## [BUG提交](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=bug%e6%8f%90%e4%ba%a4)
本書經過多重校訂,但還是難免有所遺漏被新讀者發現。如果你在正文或示例中發現任何錯誤的內容,請在[此處](https://github.com/BruceEckel/OnJava8-examples/issues)提交錯誤以及建議更正,作者感激不盡。
## [郵箱訂閱](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=%e9%82%ae%e7%ae%b1%e8%ae%a2%e9%98%85)
你可以在[www.OnJava8.com](http://www.onjava8.com/)上訂閱郵件。郵件不含廣告并盡量提供干貨。
## [Java圖形界面](https://lingcoder.gitee.io/onjava8/#/book/00-Introduction?id=java%e5%9b%be%e5%bd%a2%e7%95%8c%e9%9d%a2)
Java 在圖形用戶界面和桌面程序方面的發展可以說是一段悲傷的歷史。Java 1.0 中圖形用戶界面(GUI)庫的原始設計目標是讓用戶能在所有平臺提供一個漂亮的界面。但遺憾的是,這個理想沒有實現。相反,Java 1.0 AWT(抽象窗口工具包)在所有平臺都表現平平,并且有諸多限制。你只能使用四種字體。另外,Java 1.0 AWT 編程模型也很笨拙且非面向對象。我的一個曾在 Java 設計期間工作過的學生道出了緣由:早期的 AWT 設計是在僅僅在一個月內構思、設計和實施的。不得不說這是一個“奇跡”,但同時更是“設計失敗”的絕佳教材。
在 Java 1.1 版本的 AWT 中 情況有所改善,事件模型帶來更加清晰的面向對象方法,并添加了JavaBeans,致力于面向易于創建可視化編程環境的組件編程模型(已廢棄)。
Java 2(Java 1.2)通過使用 Java 基類(JFC)內容替換來完成從舊版 Java 1.0 AWT 的轉換。其中 GUI 部分稱為 Swing。這是一組豐富的 JavaBeans,它們創建了一個合理的 GUI。修訂版 3(3之前都不好)比以往更適用于開發圖形界面程序。
Sun 在圖形界面的最后一次嘗試,稱為 JavaFX。當 Oracle 收購 Sun 時,他們將原來雄心勃勃的項目(包括腳本語言)改為庫,現在它似乎是 Java 官方唯一還在開發中的 UI 工具包(參見維基百科關于 JavaFX 的文章) - 但即使如此,JavaFX 最終似乎也失敗了。
現今 Swing 依然是 Java 發行版的一部分(只接受維護,不再有新功能開發)。而 Java 現在是一個開源項目,它應該始終可用。此外,Swing 和 JavaFX 有一些有限的交互性。這些可能是為了幫助開發者過渡到 JavaFX。
桌面程序領域似乎從未嘗勾起 Java 設計師的野心。Java 沒有在圖形界面取得該有的一席之地。另外,曾被大肆吹噓的 JavaBeans 也沒有獲得任何影響力。(許多不幸的作者花了很多精力在 Swing 上編寫書籍,甚至只用 JavaBeans 編寫書籍)。Java 圖形界面程序大多數情況下僅用于 IDE(集成開發環境)和一些企業內部應用程序。你可以采用 Java 開發圖形界面,但這并非 Java 最擅長的領域。如果你必須學習 Swing,可以參考*Thinking in Java*第4版(可從[www.OnJava8.com](http://www.onjava8.com/)獲得)或者通過其他專門的書籍學習。
- 譯者的話
- 前言
- 簡介
- 第一章 對象的概念
- 抽象
- 接口
- 服務提供
- 封裝
- 復用
- 繼承
- "是一個"與"像是一個"的關系
- 多態
- 單繼承結構
- 集合
- 對象創建與生命周期
- 異常處理
- 本章小結
- 第二章 安裝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的優良傳統
- 附錄:成為一名程序員