Java編程的邏輯( 簡體 字) | |
作者:馬俊昌 著 | 類別:1. -> 程式設計 -> JAVA -> Java |
出版社:機械工業出版社 | 3dWoo書號: 48272 詢問書籍請說出此書號! 有庫存 NT售價: 495 元 |
出版日:12/1/2017 | |
頁數:670 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787111587729 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
讀者評論
前言 第一部分 編程基礎與二進制 第1章 編程基礎2 1.1 數據類型和變量3 1.2 賦值4 1.2.1 基本類型4 1.2.2 數組類型6 1.3 基本運算8 1.3.1 算術運算8 1.3.2 比較運算10 1.3.3 邏輯運算10 1.3.4 小結11 1.4 條件執行11 1.4.1 語法和陷阱11 1.4.2 實現原理14 1.5 循環16 1.5.1 循環的4種形式16 1.5.2 循環控制19 1.5.3 實現原理20 1.5.4 小結20 1.6 函數的用法21 1.6.1 基本概念21 1.6.2 進一步理解函數23 1.6.3 小結27 1.7 函數調用的基本原理27 1.7.1 棧的概念27 1.7.2 函數執行的基本原理28 1.7.3 數組和對象的內存分配29 1.7.4 遞歸調用的原理30 1.7.5 小結31 第2章 理解數據背后的二進制33 2.1 整數的二進制表示與位運算33 2.1.1 正整數的二進制表示33 2.1.2 負整數的二進制表示34 2.1.3 十六進制35 2.1.4 位運算36 2.2 小數的二進制表示37 2.2.1 小數計算為什么會出錯37 2.2.2 二進制表示38 2.3 字符的編碼與亂碼39 2.3.1 常見非Unicode編碼39 2.3.2 Unicode編碼42 2.3.3 編碼轉換44 2.3.4 亂碼的原因45 2.3.5 從亂碼中恢復46 2.4 char的真正含義49 第二部分 面向對象 第3章 類的基礎52 3.1 類的基本概念52 3.1.1 函數容器52 3.1.2 自定義數據類型53 3.1.3 定義第一個類55 3.1.4 使用第一個類55 3.1.5 變量默認值57 3.1.6 private變量57 3.1.7 構造方法58 3.1.8 類和對象的生命周期60 3.1.9 小結61 3.2 類的組合61 3.2.1 String和Date61 3.2.2 圖形類62 3.2.3 用類描述電商概念63 3.2.4 用類描述人之間的血緣關系65 3.2.5 目錄和文件66 3.2.6 一些說明67 3.2.7 小結68 3.3 代碼的組織機制68 3.3.1 包的概念68 3.3.2 jar包71 3.3.3 程序的編譯與鏈接71 3.3.4 小結72 第4章 類的繼承73 4.1 基本概念73 4.1.1 根父類Object74 4.1.2 方法重寫74 4.1.3 圖形類繼承體系75 4.1.4 小結80 4.2 繼承的細節80 4.2.1 構造方法81 4.2.2 重名與靜態綁定82 4.2.3 重載和重寫83 4.2.4 父子類型轉換85 4.2.5 繼承訪問權限protected85 4.2.6 可見性重寫86 4.2.7 防止繼承final87 4.3 繼承實現的基本原理88 4.3.1 示例88 4.3.2 類加載過程90 4.3.3 對象創建的過程91 4.3.4 方法調用的過程92 4.3.5 變量訪問的過程93 4.4 為什么說繼承是把雙刃劍94 4.4.1 繼承破壞封裝94 4.4.2 封裝是如何被破壞的94 4.4.3 繼承沒有反映is-a關系97 4.4.4 如何應對繼承的雙面性97 第5章 類的擴展100 5.1 接口的本質100 5.1.1 接口的概念101 5.1.2 定義接口101 5.1.3 實現接口102 5.1.4 使用接口103 5.1.5 接口的細節105 5.1.6 使用接口替代繼承106 5.1.7 Java 8和Java 9對接口的增強106 5.1.8 小結108 5.2 抽象類108 5.2.1 抽象方法和抽象類108 5.2.2 為什么需要抽象類109 5.2.3 抽象類和接口109 5.2.4 小結110 5.3 內部類的本質111 5.3.1 靜態內部類111 5.3.2 成員內部類113 5.3.3 方法內部類115 5.3.4 匿名內部類117 5.4 枚舉的本質119 5.4.1 基礎120 5.4.2 典型場景122 第6章 異常125 6.1 初識異常125 6.1.1 NullPointerException(空指針異常)125 6.1.2 NumberFormatException(數字格式異常)126 6.2 異常類128 6.2.1 Throwable128 6.2.2 異常類體系129 6.2.3 自定義異常130 6.3 異常處理131 6.3.1 catch匹配131 6.3.2 重新拋出異常131 6.3.3 finally132 6.3.4 try-with-resources133 6.3.5 throws134 6.3.6 對比受檢和未受檢異常135 6.4 如何使用異常135 6.4.1 異常應該且僅用于異常情況136 6.4.2 異常處理的目標136 6.4.3 異常處理的一般邏輯137 第7章 常用基礎類138 7.1 包裝類138 7.1.1 基本用法139 7.1.2 共同點140 7.1.3 剖析Integer與二進制算法144 7.1.4 剖析Character149 7.2 剖析String155 7.2.1 基本用法156 7.2.2 走進String內部157 7.2.3 編碼轉換157 7.2.4 不可變性158 7.2.5 常量字符串159 7.2.6 hashCode160 7.2.7 正則表達式161 7.3 剖析StringBuilder162 7.3.1 基本用法162 7.3.2 基本實現原理162 7.3.3 String的+和+ =運算符165 7.4 剖析Arrays166 7.4.1 用法166 7.4.2 多維數組171 7.4.3 實現原理172 7.4.4 小結174 7.5 剖析日期和時間174 7.5.1 基本概念174 7.5.2 日期和時間API175 7.5.3 局限性182 7.6 隨機183 7.6.1 Math.random183 7.6.2 Random184 7.6.3 隨機的基本原理185 7.6.4 隨機密碼187 7.6.5 洗牌189 7.6.6 帶權重的隨機選擇189 7.6.7 搶紅包算法191 7.6.8 北京購車搖號算法192 7.6.9 小結193 第三部分 泛型與容器 第8章 泛型196 8.1 基本概念和原理196 8.1.1 一個簡單泛型類197 8.1.2 容器類199 8.1.3 泛型方法201 8.1.4 泛型接口202 8.1.5 類型參數的限定202 8.1.6 小結205 8.2 解析通配符205 8.2.1 更簡潔的參數類型限定205 8.2.2 理解通配符206 8.2.3 超類型通配符208 8.2.4 通配符比較211 8.3 細節和局限性211 8.3.1 使用泛型類、方法和接口211 8.3.2 定義泛型類、方法和接口213 8.3.3 泛型與數組214 8.3.4 小結217 第9章 列表和隊列218 9.1 剖析ArrayList218 9.1.1 基本用法218 9.1.2 基本原理219 9.1.3 迭代221 9.1.4 ArrayList實現的接口225 9.1.5 ArrayList的其他方法227 9.1.6 ArrayList特點分析229 9.1.7 小結229 9.2 剖析LinkedList229 9.2.1 用法230 9.2.2 實現原理232 9.2.3 LinkedList特點分析238 9.3 剖析ArrayDeque239 9.3.1 實現原理239 9.3.2 ArrayDeque特點分析244 第10章 Map和Set245 10.1 剖析HashMap245 10.1.1 Map接口245 10.1.2 HashMap247 10.1.3 實現原理247 10.1.4 小結256 10.2 剖析HashSet256 10.2.1 用法256 10.2.2 實現原理258 10.2.3 小結259 10.3 排序二叉樹260 10.3.1 基本概念260 10.3.2 基本算法261 10.3.3 平衡的排序二叉樹263 10.3.4 小結264 10.4 剖析TreeMap264 10.4.1 基本用法265 10.4.2 實現原理267 10.4.3 小結273 10.5 剖析TreeSet274 10.5.1 基本用法274 10.5.2 實現原理275 10.5.3 小結276 10.6 剖析LinkedHashMap276 10.6.1 基本用法276 10.6.2 實現原理279 10.6.3 LinkedHashSet282 10.6.4 小結282 10.7 剖析EnumMap283 10.7.1 基本用法283 10.7.2 實現原理285 10.7.3 小結287 10.8 剖析EnumSet287 10.8.1 基本用法287 10.8.2 應用場景288 10.8.3 實現原理291 10.8.4 小結294 第11章 堆與優先級隊列295 11.1 堆的概念與算法296 11.1.1 基本概念296 11.1.2 堆的算法298 11.1.3 小結302 11.2 剖析PriorityQueue302 11.2.1 基本用法302 11.2.2 實現原理304 11.2.3 小結309 11.3 堆和PriorityQueue的應用309 11.3.1 求前K個最大的元素309 11.3.2 求中值311 11.3.3 小結314 第12章 通用容器類和總結315 12.1 抽象容器類315 12.1.1 AbstractCollection316 12.1.2 AbstractList319 12.1.3 AbstractSequentialList321 12.1.4 AbstractMap323 12.1.5 AbstractSet325 12.1.6 AbstractQueue325 12.1.7 小結326 12.2 Collections326 12.2.1 查找和替換327 12.2.2 排序和調整順序329 12.2.3 添加和修改332 12.2.4 適配器333 12.2.5 裝飾器338 12.2.6 小結342 12.3 容器類總結342 12.3.1 用法和特點342 12.3.2 數據結構和算法344 12.3.3 設計思維和模式344 第四部分 文件 第13章 文件基本技術348 13.1 文件概述348 13.1.1 基本概念和常識348 13.1.2 Java文件概述352 13.2 二進制文件和字節流355 13.2.1 InputStream/OutputStream355 13.2.2 FileInputStream/File-OutputStream357 13.2.3 ByteArrayInputStream/ByteArrayOutputStream359 13.2.4 DataInputStream/Data-OutputStream361 13.2.5 BufferedInputStream/BufferedOutputStream363 13.2.6 實用方法364 13.2.7 小結365 13.3 文本文件和字符流365 13.3.1 基本概念366 13.3.2 Reader/Writer368 13.3.3 InputStreamReader/Output-StreamWriter368 13.3.4 FileReader/FileWriter369 13.3.5 CharArrayReader/Char-ArrayWriter370 13.3.6 StringReader/StringWriter370 13.3.7 BufferedReader/Buffered-Writer371 13.3.8 PrintWriter372 13.3.9 Scanner374 13.3.10 標準流374 13.3.11 實用方法376 13.3.12 小結377 13.4 文件和目錄操作378 13.4.1 構造方法378 13.4.2 文件元數據378 13.4.3 文件操作379 13.4.4 目錄操作380 第14章 文件高級技術383 14.1 常見文件類型處理384 14.1.1 屬性文件384 14.1.2 CSV文件385 14.1.3 Excel388 14.1.4 HTML389 14.1.5 壓縮文件391 14.2 隨機讀寫文件394 14.2.1 用法394 14.2.2 設計一個鍵值數據庫BasicDB396 14.2.3 BasicDB的實現397 14.2.4 小結401 14.3 內存映射文件402 14.3.1 基本概念402 14.3.2 用法403 14.3.3 設計一個消息隊列BasicQueue404 14.3.4 實現消息隊列406 14.3.5 小結409 14.4 標準序列化機制409 14.4.1 基本用法409 14.4.2 復雜對象411 14.4.3 定制序列化411 14.4.4 序列化的基本原理413 14.4.5 版本問題414 14.4.6 序列化特點分析414 14.5 使用Jackson序列化為JSON/XML/MessagePack415 14.5.1 基本概念415 14.5.2 基本用法415 14.5.3 容器對象418 14.5.4 復雜對象419 14.5.5 定制序列化420 14.5.6 Jackson對XML支持的局限性428 14.5.7 小結428 第五部分 并發 第15章 并發基礎知識430 15.1 線程的基本概念430 15.1.1 創建線程430 15.1.2 線程的基本屬性和方法432 15.1.3 共享內存及可能存在的問題435 15.1.4 線程的優點及成本438 15.2 理解synchronized439 15.2.1 用法和基本原理439 15.2.2 進一步理解synchronized443 15.2.3 同步容器及其注意事項445 15.3 線程的基本協作機制450 15.3.1 協作的場景450 15.3.2 wait/notify450 15.3.3 生產者/消費者模式453 15.3.4 同時開始455 15.3.5 等待結束456 15.3.6 異步結果458 15.3.7 集合點461 15.3.8 小結462 15.4 線程的中斷463 15.4.1 取消/關閉的場景463 15.4.2 取消/關閉的機制463 15.4.3 線程對中斷的反應464 15.4.4 如何正確地取消/關閉線程467 15.4.5 小結467 第16章 并發包的基石468 16.1 原子變量和CAS468 16.1.1 AtomicInteger469 16.1.2 ABA問題472 16.1.3 小結473 16.2 顯式鎖473 16.2.1 接口Lock473 16.2.2 可重入鎖ReentrantLock474 16.2.3 ReentrantLock的實現原理478 16.2.4 對比ReentrantLock和synchronized483 16.3 顯式條件483 16.3.1 用法483 16.3.2 生產者/消費者模式486 16.3.3 實現原理487 16.3.4 小結489 第17章 并發容器490 17.1 寫時復制的List和Set490 17.1.1 CopyOnWriteArrayList490 17.1.2 CopyOnWriteArraySet493 17.2 ConcurrentHashMap493 17.2.1 并發安全494 17.2.2 原子復合操作495 17.2.3 高并發的基本機制495 17.2.4 迭代安全496 17.2.5 弱一致性497 17.2.6 小結497 17.3 基于跳表的Map和Set498 17.3.1 基本概念498 17.3.2 基本實現原理499 17.4 并發隊列501 17.4.1 無鎖非阻塞并發隊列501 17.4.2 普通阻塞隊列502 17.4.3 優先級阻塞隊列503 17.4.4 延時阻塞隊列503 17.4.5 其他阻塞隊列503 第18章 異步任務執行服務505 18.1 基本概念和原理505 18.1.1 基本接口505 18.1.2 基本用法507 18.1.3 基本實現原理509 18.1.4 小結513 18.2 線程池513 18.2.1 理解線程池513 18.2.2 工廠類Executors516 18.2.3 線程池的死鎖518 18.2.4 小結518 18.3 定時任務的那些陷阱518 18.3.1 Timer和TimerTask518 18.3.2 ScheduledExecutorService523 18.3.3 小結526 第19章 同步和協作工具類527 19.1 讀寫鎖ReentrantReadWrite-Lock527 19.2 信號量Semaphore529 19.3 倒計時門栓CountDownLatch531 19.4 循環柵欄CyclicBarrier533 19.5 理解ThreadLocal535 19.5.1 基本概念和用法535 19.5.2 使用場景536 19.5.3 基本實現原理538 第20章 并發總結541 20.1 線程安全的機制541 20.2 線程的協作機制543 20.3 容器類544 20.4 任務執行服務546 第六部分 動態與函數式編程 第21章 反射550 21.1 Class類551 21.2 應用示例559 21.3 反射與泛型561 第22章 注解564 22.1 內置注解564 22.2 框架和庫的注解566 22.3 創建注解568 22.4 查看注解信息570 22.5 注解的應用:定制序列化571 22.6 注解的應用:DI容器573 第23章 動態代理577 23.1 靜態代理577 23.2 Java SDK動態代理579 23.2.1 用法579 23.2.2 基本原理581 23.2.3 動態代理的優點582 23.3 cglib動態代理584 23.4 Java SDK代理與cglib代理比較585 23.5 動態代理的應用:AOP585 23.5.1 用法585 23.5.2 實現原理587 第24章 類加載機制592 24.1 類加載的基本機制和過程593 24.2 理解ClassLoader594 24.3 類加載的應用:可配置的策略597 24.4 自定義ClassLoader598 24.5 自定義ClassLoader的應用:熱部署599 第25章 正則表達式603 25.1 語法603 25.2 Java API612 25.3 模板引擎618 25.4 剖析常見表達式619 第26章 函數式編程628 26.1 Lambda表達式628 26.1.1 通過接口傳遞代碼629 26.1.2 Lambda語法630 26.1.3 函數式接口632 26.1.4 預定義的函數式接口632 26.1.5 方法引用635 26.1.6 函數的復合636 26.1.7 小結637 26.2 函數式數據處理:基本用法637 26.2.1 基本示例638 26.2.2 中間操作640 26.2.3 終端操作642 26.2.4 構建流646 26.2.5 函數式數據處理思維646 26.3 函數式數據處理:強大方便的收集器647 26.3.1 理解collect647 26.3.2 容器收集器648 26.3.3 字符串收集器651 26.3.4 分組651 26.4 組合式異步編程658 26.4.1 異步任務管理658 26.4.2 與Future/FutureTask對比659 26.4.3 響應結果或異常662 26.4.4 構建依賴單一階段的任務流664 26.4.5 構建依賴兩個階段的任務流665 26.4.6 構建依賴多個階段的任務流666 26.4.7 小結667 26.5 Java 8的日期和時間API668 26.5.1 表示日期和時間668 26.5.2 格式化670 26.5.3 設置和修改時間671 26.5.4 時間段的計算673 26.5.5 與Date/Calendar對象的轉換674 學習編程并不容易:理論枯燥,比如二進制和編碼、數據結構和算法、面向對象、設計模式、操作系統等;而學習具體編程語言的時候,又側重學習的是語法和API,難以和之前的理論建立密切的聯系,再到實踐應用,更是知其然而不知其所以然。如果有一本書能彌合理論與實踐之間的鴻溝,建立起編程由表及里的地圖,學習就可以事半功倍。
不同于一般已有圖書,或側重應用或側重理論,本書基于Java語言講解,幫助讀者理解編程到底是怎么回事,盡量通俗易懂、循序漸進地介紹編程中的主要概念、語法和類庫,同時剖析背后的實現原理,以與基礎理論相結合,此外結合一些實用編程經驗和教訓,解釋一些更為高層的框架和庫的基本原理,以與實踐應用相結合,在此過程中,融合編程的一些通用思維邏輯。 作者的系列文章發表在CSDN、掘金、開發者頭條、博客園等社區,廣受讀者好評,希望你也可以獲得和他們一樣的感受:通俗易懂、力透紙背、豁然開朗。 資深Java專家撰寫,力求透徹講解每個知識點,逐步建立編程知識圖譜。本書以Java語言為例,由基礎概念入手,到背后實現原理與邏輯,再到應用實踐,融會貫通。全書共六大部分,其要點如下。 第一部分(第1~2章)講解計算機程序的基本執行流程與元素,以及數據背后的二進制表示,幫讀者掌握編程的基本概念。 第二部分(第3~7章)講解面向對象的編程原理與邏輯,涉及類、繼承與多態、接口與抽象類、異常與常用基礎類,讓讀者透徹了解Java的重要基礎——面向對象。 第三部分(第8~12章)介紹泛型與容器及其數據結構和算法,涵蓋泛型、列表和隊列、各種Map和Set、堆與優先級隊列等。 第四部分(第13~14章)介紹文件處理。涵蓋文件的基本概念、二進制文件和字節流、文本文件和字符流、文件和目錄操作,以及文件處理的一些高級技術,包括常見文件類型的處理、隨機讀寫文件、內存映射文件、標準序列化機制,以及Jackson序列化。 第五部分(第15~20章)介紹并發,包括線程的傳統基礎知識和Java并發包。傳統基礎知識包括線程的基本概念與基本的同步、協作和中斷機制;Java并發包涵蓋原子變量、顯式鎖、顯式條件、并發容器、異步任務執行服務、同步和協作工具類。 第六部分(第21~26章)介紹動態編程和聲明式編程思路、API與技巧,涵蓋反射、注解、動態代理、類加載機制、正則表達式、Java 8引入的函數式編程等。 為什么要寫這本書
寫一本關于編程的書,是我大概15年前就有的一個想法,當時,我體會到了編程中數據結構的美妙和神奇,有一種收獲的喜悅和分享的沖動。這種收獲是我反復閱讀教程十幾遍,花大量時間上機練習調試得到的,這是一個比較痛苦的過程。我想,如果把我學到的知識更為清晰易懂地表達出來,其他人不就可以掌握編程容易一些,并體會到那種喜悅了嗎?不過,當時感覺自己學識太淺,要學習的東西太多,想一想也就算了。 觸發我開始寫作是在2016年年初,可汗學院的事跡震撼了我。可汗學院的創始人是薩爾曼·可汗,他自己錄制了3000多個短視頻,主要教中小學生基礎課。他為每門課程建立了知識地圖,地圖由知識點組成,知識點之間有依賴關系。每個知識點都有一個視頻,每個視頻10分鐘左右,他的講解清晰透徹,極受歡迎。比爾·蓋茨聲稱可汗是他最欣賞的老師,邀請其在TED發表演講,同時投資可汗成立了非營利機構可汗學院,可汗也受到了來自谷歌等公司的投資。可以說,可汗以一己之力推動了全世界的教育。 我就想,我可不可以學習可汗,為計算機編程教育做一點事情?也就是說,為編程的核心知識建立知識地圖,從最基礎的概念開始,分解為知識點,一個知識點一個知識點地講解,每一個知識點都力爭清晰透徹,闡述知識點是什么、怎么用、有什么用途、實現原理是什么、思維邏輯是什么、與其他知識點有什么關系等。可汗的形式是視頻,但我想先從文字總結開始。我希望表達的是編程的通用知識,但編程總要用一個具體語言,我想就用我最熟悉的Java吧。 過去十幾年,Java一直是軟件開發領域最主流的語言之一,在可以預見的未來,Java還將是最主流的語言之一。但關于Java編程的書比比皆是,也不乏經典之作,市場還需要一本關于Java編程的書嗎?甚至,還需要編程的書嗎?如果需要,需要什么樣的書呢? 關于編程的需求,我想答案是肯定的。過去幾十年,IT革命深刻地改變了人們的生活,但這次革命還遠遠沒有停止,在可以預見的未來,人工智能等前沿技術必將進一步改變世界,而要掌握人工智能技術,必須先掌握基本編程技術。人工智能在我國已經上升為國家戰略。2017年7月,國務院印發了《新一代人工智能發展規劃》,其中提到“實施全民智能教育項目,在中小學階段設置人工智能相關課程,逐步推廣編程教育”,未來,可能大部分人都需要學習編程。 關于編程的書是很多,但對于非計算機專業學生而言,掌握編程依然是一件困難的事情。絕大部分教程以及培訓班過于追求應用,讀者學完之后雖然能照著例子寫一些程序,但卻懵懵懂懂,知其然而不知其所以然,無法靈活應用,當希望進一步深入學習時,發現大部分專業書籍晦澀難懂,難以找到通俗易懂的與學過的應用相結合的進階原理類書籍。 即使計算機專業的學生,學習編程也不容易。學校開設了很多理論課程,但學習理論的時候往往感覺比較枯燥,比如二進制、編碼、數據結構和算法、設計模式、操作系統中的線程和文件系統知識等。而學習具體編程語言的時候,又側重學習的是語法和API。學習計算機理論的重要目的是為了更好地編程,但學生卻難以在理論和編程之間建立密切的聯系。 這樣,我的想法基本就確定了,用Java語言寫一本幫助理解編程到底是怎么回事的書,盡量用通俗易懂的方式循序漸進地介紹編程中的主要概念、語法和類庫,不僅介紹用法和應用,還剖析背后的實現原理,以與基礎理論相結合,同時包含一些實用經驗和教訓,并解釋一些更為高層的框架和庫的基本原理,以與實踐應用相結合,在此過程中,融合編程的一些通用思維邏輯。 我有能力寫好嗎?我并不是編程大師,但我想,可汗也不是每個領域的大師,但他講授了很多領域的知識,的確幫助了很多人。過去十幾年我一直從事編程方面的工作,也在不斷學習和思考,我想,只要用心寫,至少會給一些人帶來一點幫助吧。 于是,我在2016年3月創建了微信公眾號“老馬說編程”,開始發布系列文章“計算機程序的思維邏輯”。每一篇文章對我都是一個挑戰,每一個知識點我都花大量時間用心思考,反復琢磨,力求表達清晰透徹,做到最好。寫作是一個痛苦和快樂交織的過程,最痛苦的就是滿腦子都是相關的內容,但就是不知道該怎么表達的時候,而最快樂的就是寫完一篇文章的時候。令人欣慰的是,這些文章受到了大量讀者的極高評價,他們的溢美之詞、自發分享和紅包贊賞進一步增強了我寫作的信心和動力。到2017年7月底,共寫了95篇文章,關于Java編程的基本內容也就寫完了。 在寫作過程中,很多讀者反饋希望文章可以盡快整理成書,以便閱讀。2016年9月,機械工業出版社的高婧雅女士聯系到了我,商討出版的可能,在她的鼎力幫助和出版社的大力支持下,就有了大家看到的這本書。 本書特色 本書致力于幫助讀者真正理解Java編程。對于每個語言特性和API,不僅介紹其概念和用法,還分析了為什么要有這個概念,實現原理是什么,背后的思維邏輯是什么;對于類庫,分析了大量源碼,使讀者不僅知其然,還知其所以然,以透徹理解相關知識點。 本書雖然是Java語言描述,但以更為通用的編程邏輯為主,融入了很多通用的編程相關知識,如二進制、編碼、數據結構和算法、設計模式、操作系統、編程思維等,使讀者不僅能夠學習Java語言,還可以提升整體的編程和計算機水平。 本書不僅注重實現原理,而且重視實用性。本書介紹了很多實踐中常用的技術,包含不少實際開發中積累的經驗和教訓,使讀者可以少走一些彎路。在實際開發中,我們經常使用一些高層的系統程序、框架和庫,以提升開發效率,本書也介紹了如何利用基本API開發一些系統程序和框架,比如鍵值數據庫、消息隊列、序列化框架、DI(依賴注入)容器、AOP(面向切面編程)框架、熱部署、模板引擎等,講解這些內容的目的不是為了“重新發明輪子”,而是為了幫助讀者更好地理解和應用高層的系統程序與框架。 本書高度注重表述,盡力站在讀者的角度,循序漸進、簡潔透徹,從最基本的概念開始,一步步推導出更為高級的概念,在介紹每個知識點時,都會盡力先介紹用法、示例和應用,再分析實現原理和思維邏輯,并與其他知識點建立聯系,以便讀者能夠容易地、全面透徹地理解相關知識。 本書側重于Java編程的主要概念,絕大部分內容適用于Java 5以上的版本,但也包含了最近幾年Java的主要更新,包括Java 8引入的重要更新—Lambda表達式和函數化編程。 讀者對象 本書面向所有希望進一步理解編程的主要概念、實現原理和思維邏輯的讀者,具體來說有以下幾種。 初中級Java開發者:本書采用Java語言,側重于剖析編程概念背后的實現原理和內在邏輯,同時包含很多實際編程中的經驗教訓,所以,對于Java編程經歷不多,對計算機原理不太了解、對Java的很多概念一知半解的開發人員,閱讀本書的收獲可能最大,通過本書可以快速提升Java編程水平。而零基礎Java開發者,可跳過原理性內容閱讀。 非Java語言的開發者:本書不假設讀者有任何Java編程基礎,系統、全面、細致地講述了Java的語法和類庫,給出了很多示例。另外,本書介紹了很多編程的通用概念、知識、數據結構、設計模式、算法、實現原理和思維邏輯。同時,全書的討論都盡量站在一個通用的編程語言角度,而非Java語言特定的角度。通過閱讀本書,讀者可以快速學習和掌握Java,建立與其他語言之間的聯系,提升整體編程思維和水平。 中高級Java開發者:經驗豐富的Java開發者閱讀本書的收獲也會很大,可以通過本書對編程有更為系統、更為深刻的認識。 如何閱讀本書 本書分為六大部分,共26章內容。 第一部分(第1~2章)介紹編程基礎與二進制。第1章介紹編程的基礎知識,包括數據類型、變量、賦值、基本運算、條件執行、循環和函數。第2章幫助讀者理解數據背后的二進制,包括整數的二進制表示與位運算、小數計算為什么會出錯、字符的編碼與亂碼。 第二部分(第3~7章)介紹面向對象。第3章介紹類的基礎知識,包括類的基本概念、類的組合以及代碼的基本組織機制。第4章介紹類的繼承,包括繼承的基本概念、細節、實現原理,分析為什么說繼承是把雙刃劍。第5章介紹類的一些擴展概念,包括接口、抽象類、內部類和枚舉。第6章介紹異常。第7章剖析一些常用基礎類,包括包裝類、String、StringBuilder、Arrays、日期和時間、隨機。 第三部分(第8~12章)介紹泛型與容器及其背后的數據結構和算法。第8章介紹泛型,包括其基本概念和原理、通配符,以及一些細節和局限性。第9章介紹列表和隊列,剖析ArrayList、LinkedList以及ArrayDeque。第10章介紹各種Map和Set,剖析HashMap、HashSet、排序二叉樹、TreeMap、TreeSet、LinkedHashMap、LinkedHashSet、EnumMap和EnumSet。第11章介紹堆與優先級隊列,包括堆的概念和算法及其應用。第12章介紹一些抽象容器類,分析通用工具類Collections,最后對整個容器類體系從多個角度進行系統總結。 第四部分(第13~14章)介紹文件。第13章主要介紹文件的基本技術,包括文件的一些基本概念和常識、Java中處理文件的基本結構、二進制文件和字節流、文本文件和字符流,以及文件和目錄操作。第14章介紹文件處理的一些高級技術,包括一些常見文件類型的處理、隨機讀寫文件、內存映射文件、標準序列化機制,以及Jackson序列化。 第五部分(第15~20章)介紹并發。第15章介紹并發的傳統基礎知識,包括線程的基本概念、線程同步的基本機制synchronized、線程協作的基本機制wait/notify,以及線程的中斷。第16章介紹并發包的基石,包括原子變量和CAS、顯式鎖與顯式條件。第17章介紹并發容器,包括寫時復制的List和Set、ConcurrentHashMap、基于跳表的Map和Set,以及各種并發隊列。第18章介紹異步任務執行服務,包括基本概念和實現原理、主要的實現機制線程池,以及定時任務。第19章介紹一些專門的同步和協作工具類,包括讀寫鎖、信號量、倒計時門栓、循環柵欄,以及ThreadLocal。第20章對整個并發部分從多個角度進行系統總結。 第六部分(第21~26章)介紹動態與函數式編程。第21章介紹反射,包括反射的用法和應用。第22章介紹注解,包括注解的使用、創建,以及兩個應用:定制序列化和DI容器。第23章介紹動態代理的用法和原理,包括Java SDK動態代理和cglib動態代理以及一個應用:AOP。第24章介紹類加載機制,包括類加載的基本機制和過程,ClassLoader的用法和自定義,以及它們的應用:可配置的策略與熱部署。第25章介紹正則表達式,包括語法、Java API、一個簡單的應用(模板引擎),最后剖析一些常見表達式。第26章介紹Java 8引入的函數式編程,包括Lambda表達式、函數式數據處理、組合式異步編程,以及Java 8的日期和時間API。 對于有一定經驗的讀者,可以挑選感興趣的章節直接閱讀。而對于初學者,建議從頭閱讀,但對于一些比較深入的原理性內容,以及一些比較高級的內容,如果理解比較困難可以跳過,有一定實踐經驗后再回頭閱讀。任何讀者都可以將本書作為一本案頭參考書,以備隨時查閱不確定的概念、用法和原理。 勘誤和支持 由于筆者的水平有限,編寫時間倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。如果讀者有更多的寶貴意見,歡迎關注我的微信公眾號“老馬說編程”,可在后臺留言,在“關于”部分也有最新的微信和QQ群信息,歡迎加入討論,我會盡量提供滿意的解答。同時,讀者也可以通過郵箱swiftma@sina.com聯系到我。期待得到你們的真摯反饋,在技術之路上互勉共進。 致謝 感謝我的微信公眾號“老馬說編程”、掘金、開發者頭條和博客園技術社區的廣大讀者,他們的極高評價、自發分享和紅包贊賞讓我備受鼓舞,更重要的是,他們指出了很多文章中的錯誤,使我可以及時修正。 感謝掘金和開發者頭條技術社區,他們經常推薦我的文章,使更多人可以看到。 感謝我在北京理工大學學習時的老師和同學們,在老師的教導和同學們的探討中,我掌握了比較扎實的計算機基礎,特別是我的已故恩師古志民教授,古教授指導我完成了本科到博士的學業,他嚴謹認真的學術態度深深地影響了我。 感謝我工作以來的領導和同事們,由于他們的言傳身教,我得以不斷提高自己的技術水平。 感謝機械工業出版社的編輯高婧雅,在一年多的時間中始終支持我的寫作,她的幫助和建議引導我順利完成全部書稿。 特別致謝 特別感謝我的愛人吳特和兒子久久,我為寫作這本書,犧牲了很多陪伴他們的時間,但也正因為有了他們的付出與支持,我才能堅持寫下去。 特別感謝我岳父母,特別是我的岳母,不遺余力地幫助我們照顧兒子,有了他們的幫助和支持,我才有時間和精力去完成寫作工作。 特別感謝我的父母,他們在困難的生活條件下,付出了巨大的汗水與心血,將我養育成人,使我能夠完成博士學業,他們一生勤勞樸素的品質深深地影響了我。 特別感謝我的兄長馬俊杰,他一直是我成長路上的指明燈,也是從他的耐心講解中我第一次了解到了計算機的基本工作機制。 謹以此書獻給我最親愛的家人,以及眾多熱愛編程技術的朋友們! 馬俊昌 |