Contents 目錄
讀者評論
前言
第一部分 編程基礎與二進製
第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.2 顯式鎖473
16.3 顯式條件483
第17章 並發容器490
17.1 寫時復製的List和Set490
17.2 ConcurrentHashMap493
17.3 基於跳錶的Map和Set498
17.4 並發隊列501
第18章 異步任務執行服務505
18.1 基本概念和原理505
18.2 綫程池513
18.3 定時任務的那些陷阱518
第19章 同步和協作工具類527
19.1 讀寫鎖ReentrantReadWrite-Lock527
19.2 信號量Semaphore529
19.3 倒計時門栓CountDownLatch531
19.4 循環柵欄CyclicBarrier533
19.5 理解ThreadLocal535
第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.3 cglib動態代理584
23.4 Java SDK代理與cglib代理比較585
23.5 動態代理的應用:AOP585
第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.2 函數式數據處理:基本用法637
26.3 函數式數據處理:強大方便的收集器647
26.4 組閤式異步編程658
26.5 Java 8的日期和時間API668
· · · · · · (
收起)
Java專傢撰寫,力求透徹講解每個知識點,逐步建立編程知識圖譜。本書以Java語言為例,由基礎概念入手,到背後實現原理與邏輯,再到應用實踐,融會貫通。
全書共六大部分,其要點如下。
第一部分(第1~2章)講解計算機程序的基本執行流程與元素,以及數據背後的二進製錶示,幫讀者掌握編程的基本概念。
第二部分(第3~7章)講解麵嚮對象的編程原理與邏輯,涉及類、繼承與多態、接口與抽象類、異常與常用基礎類,讓讀者透徹瞭解Java的重要基礎——麵嚮對象。
第三部分(第8~12章)介紹泛型與容器及其數據結構和算法,涵蓋泛型、列錶和隊列、各種Map和Set、堆與優先級隊列等。
第四部分(第13~14章)介紹文件處理。涵蓋文件的基本概念、二進製文件和字節流、文本文件和字符流、文件和目錄操作,以及文件處理的一些高級技術,包括常見文件類型的處理、隨機讀寫文件、內存映射文件、標準序列化機製,以及Jackson序列化。
第五部分(第15~20章)介紹並發,包括綫程的傳統基礎知識和Java並發包。傳統基礎知識包括綫程的基本概念與基本的同步、協作和中斷機製;Java並發包涵蓋原子變量、顯式鎖、顯式條件、並發容器、異步任務執行服務、同步和協作工具類。
第六部分(第21~26章)介紹動態和聲明式編程編程思路、API與技巧,涵蓋反射、注解、動態代理、類加載機製、正則錶達式、Java 8引入的函數式編程等。
這本書和彆的書有什麼不同?
簡單來說,其他書大多教你怎麼用,而這本書幫助你透徹理解,從基本概念到高層框架,剖析實現原理與JDK源代碼,融閤專業理論與應用實踐,使你透徹理解Java編程的實現原理和思維邏輯,融會貫通。具體來說:
1)對於每個編程概念,不僅介紹瞭語法和用法,還分析瞭為什麼要有這個概念,實現原理是什麼,背後的思維邏輯是什麼;
2)對於Java的主要API(如Java基礎類、各種容器類、文件、並發包等),不僅介紹瞭用法、示例和應用,還剖析瞭大量JDK源代碼,解釋瞭其內部實現機製;
3)對於實踐中常用的係統程序和框架,如鍵值數據庫、消息隊列、序列化框架、DI(依賴注入)容器、AOP(麵嚮切麵編程)框架、熱部署、模闆引擎等,本書利用基本API演示瞭其基本實現原理;
4)本書不僅注重實現原理,同樣重視實用性,介紹瞭很多實踐中常用的技術,包含瞭不少實際開發中積纍的經驗和教訓,使讀者可以少走一些彎路;
5)本書雖然是Java語言描述,但以更為通用的編程邏輯為主,融入瞭很多通用的編程相關知識,如二進製、編碼、數據結構和算法、設計模式、操作係統、編程思維等;
6)本書高度注重錶述,盡力站在讀者的角度,循序漸進、簡潔透徹、通俗易懂。