《瘋狂Java講義(第4版)》是《瘋狂Java講義》的第4版,第4版保持了前3版系統、全面、講解淺顯、細致的特性,全面新增介紹了Java 9的新特性。
《瘋狂Java講義(第4版)》深入介紹了Java編程的相關方面,《瘋狂Java講義(第4版)》內容覆蓋了Java的基本語法結構、Java的面向對象特征、Java集合框架體系、Java泛型、異常處理、Java GUI編程、JDBC數據庫編程、Java注釋、Java的IO流體系、Java多線程編程、Java網絡通信編程和Java反射機制。覆蓋了java.lang、java.util、java.text、java.io和java.nio、java.sql、java.awt、javax.swing包下絕大部分類和接口。本書重點介紹了Java 9的模塊化系統,還詳細介紹了Java 9的jshell工具、多版本JAR包、匿名內部類的菱形語法、增強的try語句、私有接口方法,以及Java 9新增的各種API功能。
與前3版類似,《瘋狂Java講義(第4版)》并不單純從知識角度來講解Java,而是從解決問題的角度來介紹Java語言,所以《瘋狂Java講義(第4版)》中涉及大量實用案例開發:五子棋游戲、梭哈游戲、仿QQ的游戲大廳、MySQL企業管理器、仿EditPlus的文本編輯器、多線程、斷點下載工具、Spring框架的IoC容器……這些案例既能讓讀者鞏固每章的知識,又可以讓讀者學以致用,激發編程自豪感,進而引爆內心的編程激情。《瘋狂Java講義(第4版)》光盤里包含書中所有示例的代碼和《瘋狂Java實戰演義》的所有項目代碼,這些項目可以作為本書課后練習的非標準答案,如果讀者需要獲取關于課后習題的解決方法、編程思路,可以登錄http://www.crazyit.org站點與筆者及本書龐大的讀者群相互交流。
1)作者提供用于學習和交流的配套網站及作者親自在線的答疑微信群、QQ群。
2)DVD光盤中含
1500分鐘圖書部分內容的相關視頻
圖書配套代碼
Java面試題真題
PPT課件
設計模式電子書
有助于完成課后練習的大量完整案例
3)《瘋狂Java講義》歷時十年沉淀,現已升級到第4版,經過無數Java學習者的反復驗證,被包括北京大學在內的大量985、211高校的優秀教師引薦為參考資料、選作教材。
4)《瘋狂Java講義》曾翻譯為中文繁體字版,在寶島臺灣上市發行。
5)《瘋狂Java講義》屢獲殊榮,多次獲取電子工業出版社的暢銷圖書、長銷圖書獎項,作者本人也多次獲得優秀作者稱號。僅第3版一版的印量即達9萬多冊。
6)贈送線下課程優惠券。
7)介紹新知識時,通過巧妙的類比,將未知事物與已知事物進行類比,降低讀者的學習難度;對于一些復雜、易于混淆的語法,本書還歸納了瑯瑯上口的口訣,比如方法重寫的口訣,能讓讀者快速掌握Java的核心語法,并加深記憶。
8)《瘋狂Java講義》不是一本翻譯而來的Java圖書,書中不會有任何生僻、晦澀的翻譯詞匯,有的只是淺顯、易懂的表達;符合中國人思維習慣、學習方式,更適合中國人學習Java。
李剛,十余年軟件開發從業經驗,瘋狂軟件教育中心教學總監。瘋狂Java實訓營創始人,瘋狂Java體系原創圖書作者。廣東技術師范學院計算機科學系兼職副教授,CSDN特邀講師。培訓的學生已在騰訊、阿里、華為、IBM、網易、唯品會、電信盈科等名企就職。國內知名高端IT技術圖書作家,已出版《瘋狂Java講義》《瘋狂Android講義》《輕量級JavaEE企業應用實戰》《瘋狂前端開發講義》《瘋狂HTML5/CSS3/JavaScript講義》《瘋狂iOS講義(基礎篇)(提高篇)》《瘋狂XML講義》《經典JavaEE企業應用實戰》《Struts2.x權威指南》等著作。其中瘋狂Java體系圖書均已沉淀多年,贏得極高的市場認同,多次重印,多部著作印刷數量超過10萬冊,并被多所985211院校選作教材,部分圖書已被翻譯成繁體中文版,授權到中國臺灣地區。
第1章 Java語言概述與開發環境1
1.1 Java語言的發展簡史2
1.2 Java程序運行機制4
1.2.1 高級語言的運行機制4
1.2.2 Java程序的運行機制和JVM5
1.3 開發Java的準備6
1.3.1 下載和安裝Java 9的JDK6
學生提問:不是說JVM是運行Java程序的虛擬機嗎?那JRE和JVM的關系是怎樣的呢?6
學生提問:為什么不安裝公共JRE呢?8
1.3.2 設置PATH環境變量9
學生提問:為什么選擇用戶變量?用戶變量與系統變量有什么區別?10
1.4 第一個Java程序11
1.4.1 編輯Java源代碼11
1.4.2 編譯Java程序11
學生提問:當編譯C程序時,不僅需要指定存放目標文件的位置,也需要指定目標文件的文件名,這里使用javac編譯Java程序時怎么不需要指定目標文件的文件名呢?12
1.4.3 運行Java程序12
1.4.4 根據CLASSPATH環境變量定位類13
1.5 Java程序的基本規則14
1.5.1 Java程序的組織形式14
1.5.2 Java源文件的命名規則15
1.5.3 初學者容易犯的錯誤15
1.6 JDK 9新增的jshell工具17
1.7 Java 9的G1垃圾回收器18
1.8 何時開始使用IDE工具20
學生提問:我想學習Java編程,到底是學習Eclipse好,還是學習NetBeans好呢?21
1.9 本章小結21
本章練習21
第2章 理解面向對象22
2.1 面向對象23
2.1.1 結構化程序設計簡介23
2.1.2 程序的三種基本結構24
2.1.3 面向對象程序設計簡介26
2.1.4 面向對象的基本特征27
2.2 UML(統一建模語言)介紹28
2.2.1 用例圖30
2.2.2 類圖30
2.2.3 組件圖32
2.2.4 部署圖33
2.2.5 順序圖33
2.2.6 活動圖34
2.2.7 狀態機圖35
2.3 Java的面向對象特征36
2.3.1 一切都是對象36
2.3.2 類和對象36
2.4 本章小結37
第3章 數據類型和運算符38
3.1 注釋39
3.1.1 單行注釋和多行注釋39
3.1.2 Java 9增強文檔注釋40
學生提問:API文檔是什么?40
學生提問:為什么要學習查看API文檔的方法?42
3.2 標識符和關鍵字46
3.2.1 分隔符46
3.2.2 Java 9的標識符規則48
3.2.3 Java關鍵字48
3.3 數據類型分類48
學生提問:什么是變量?變量有什么用?49
3.4 基本數據類型49
3.4.1 整型50
3.4.2 字符型52
學生提問:什么是字符集?52
3.4.3 浮點型53
3.4.4 數值中使用下畫線分隔54
3.4.5 布爾型55
3.5 基本類型的類型轉換55
3.5.1 自動類型轉換56
3.5.2 強制類型轉換57
3.5.3 表達式類型的自動提升58
3.6 直接量59
3.6.1 直接量的類型59
3.6.2 直接量的賦值60
3.7 運算符61
3.7.1 算術運算符61
3.7.2 賦值運算符63
3.7.3 位運算符64
3.7.4 擴展后的賦值運算符66
3.7.5 比較運算符67
3.7.6 邏輯運算符68
3.7.7 三目運算符69
3.7.8 運算符的結合性和優先級69
3.8 本章小結71
本章練習71
第4章 流程控制與數組72
4.1 順序結構73
4.2 分支結構73
4.2.1 if條件語句73
4.2.2 Java 7增強后的switch分支語句77
4.3 循環結構79
4.3.1 while循環語句79
4.3.2 do while循環語句80
4.3.3 for循環81
4.3.4 嵌套循環84
4.4 控制循環結構85
4.4.1 使用break結束循環85
4.4.2 使用continue忽略本次循環剩下語句86
4.4.3 使用return結束方法87
4.5 數組類型87
4.5.1 理解數組:數組也是一種類型87
學生提問:int[]是一種類型嗎?怎么使用這種類型呢?88
4.5.2 定義數組88
4.5.3 數組的初始化89
學生提問:能不能只分配內存空間,不賦初始值呢?89
4.5.4 使用數組90
學生提問:為什么要我記住這些異常信息?90
4.5.5 foreach循環91
4.6 深入數組92
4.6.1 內存中的數組92
為什么有棧內存和堆內存之分?93
4.6.2 基本類型數組的初始化95
4.6.3 引用類型數組的初始化96
4.6.4 沒有多維數組98
學生提問:我是否可以讓圖4.13中灰色覆蓋的數組元素再次指向另一個數組?這樣不就可以擴展成三維數組,甚至擴展成更多維的數組嗎?99
4.6.5 Java 8增強的工具類:Arrays100
4.6.6 數組的應用舉例103
4.7 本章小結106
本章練習106
第5章 面向對象(上)107
5.1 類和對象108
5.1.1 定義類108
構造器不是沒有返回值嗎?為什么不能用void聲明呢?110
5.1.2 對象的產生和使用111
5.1.3 對象、引用和指針111
5.1.4 對象的this引用112
5.2 方法詳解116
5.2.1 方法的所屬性116
5.2.2 方法的參數傳遞機制117
5.2.3 形參個數可變的方法120
5.2.4 遞歸方法121
5.2.5 方法重載123
學生提問:為什么方法的返回值類型不能用于區分重載的方法?123
5.3 成員變量和局部變量124
5.3.1 成員變量和局部變量是什么124
5.3.2 成員變量的初始化和內存中的運行機制127
5.3.3 局部變量的初始化和內存中的運行機制129
5.3.4 變量的使用規則130
5.4 隱藏和封裝131
5.4.1 理解封裝131
5.4.2 使用訪問控制符131
5.4.3 package、import和import static134
5.4.4 Java的常用包139
5.5 深入構造器139
5.5.1 使用構造器執行初始化139
學生提問:構造器是創建Java對象的途徑,是不是說構造器完全負責創建Java對象?140
5.5.2 構造器重載140
學生提問:為什么要用this來調用另一個重載的構造器?我把另一個構造器里的代碼復制、粘貼到這個構造器里不就可以了嗎?142
5.6 類的繼承142
5.6.1 繼承的特點142
5.6.2 重寫父類的方法143
5.6.3 super限定145
5.6.4 調用父類構造器147
學生提問:為什么我創建Java對象時從未感覺到java.lang. Object類的構造器被調用過?149
5.7 多態149
5.7.1 多態性149
5.7.2 引用變量的強制類型轉換151
5.7.3 instanceof運算符152
5.8 繼承與組合153
5.8.1 使用繼承的注意點153
5.8.2 利用組合實現復用154
學生提問:使用組合關系來實現復用時,需要創建兩個Animal對象,是不是意味著使用組合關系時系統開銷更大?157
5.9 初始化塊157
5.9.1 使用初始化塊157
5.9.2 初始化塊和構造器159
5.9.3 靜態初始化塊160
5.10 本章小結162
本章練習162
第6章 面向對象(下)164
6.1 Java 8增強的包裝類165
學生提問:Java為什么要對這些數據進行緩存呢?168
6.2 處理對象169
6.2.1 打印對象和toString方法169
6.2.2 ==和equals方法171
學生提問:上面程序中判斷obj是否為Person類的實例時,為何不用obj instanceof Person來判斷呢?174
6.3 類成員174
6.3.1 理解類成員174
6.3.2 單例(Singleton)類175
6.4 final修飾符176
6.4.1 final成員變量177
6.4.2 final局部變量179
6.4.3 final修飾基本類型變量和引用類型變量的區別179
6.4.4 可執行宏替換的final變量180
6.4.5 final方法182
6.4.6 final類182
6.4.7 不可變類183
6.4.8 緩存實例的不可變類185
6.5 抽象類188
6.5.1 抽象方法和抽象類188
6.5.2 抽象類的作用191
6.6 Java 9改進的接口192
6.6.1 接口的概念192
6.6.2 Java 9中接口的定義193
6.6.3 接口的繼承195
6.6.4 使用接口196
6.6.5 接口和抽象類197
6.6.6 面向接口編程198
6.7 內部類202
6.7.1 非靜態內部類202
學生提問:非靜態內部類對象和外部類對象的關系是怎樣的?205
6.7.2 靜態內部類206
學生提問:為什么靜態內部類的實例方法也不能訪問外部類的實例屬性呢?207
學生提問:接口里是否能定義內部接口?208
6.7.3 使用內部類208
學生提問:既然內部類是外部類的成員,那么是否可以為外部類定義子類,在子類中再定義一個內部類來重寫其父類中的內部類呢?210
6.7.4 局部內部類210
6.7.5 Java 8改進的匿名內部類211
6.8 Java 8新增的Lambda表達式214
6.8.1 Lambda表達式入門214
6.8.2 Lambda表達式與函數式接口217
6.8.3 方法引用與構造器引用218
6.8.4 Lambda表達式與匿名內部類的聯系和區別221
6.8.5 使用Lambda表達式調用Arrays的類
方法222
6.9 枚舉類223
6.9.1 手動實現枚舉類223
6.9.2 枚舉類入門223
6.9.3 枚舉類的成員變量、方法和構造器225
6.9.4 實現接口的枚舉類227
學生提問:枚舉類不是用final修飾了嗎?怎么還能派生子類呢?228
6.9.5 包含抽象方法的枚舉類228
6.10 對象與垃圾回收229
6.10.1 對象在內存中的狀態229
6.10.2 強制垃圾回收230
6.10.3 finalize方法231
6.10.4 對象的軟、弱和虛引用233
6.11 修飾符的適用范圍236
6.12 Java 9的多版本JAR包237
6.12.1 jar命令詳解237
6.12.2 創建可執行的JAR包240
6.12.3 關于JAR包的技巧241
6.13 本章小結242
本章練習242
第7章 Java基礎類庫243
7.1 與用戶互動244
7.1.1 運行Java程序的參數244
7.1.2 使用Scanner獲取鍵盤輸入245
7.2 系統相關247
7.2.1 System類247
7.2.2 Runtime類與Java 9的ProcessHandle249
7.3 常用類250
7.3.1 Object類250
7.3.2 Java 7新增的Objects類252
7.3.3 Java 9改進的String、StringBuffer和StringBuilder類253
7.3.4 Math類256
7.3.5 Java 7的ThreadLocalRandom與Random258
7.3.6 BigDecimal類260
7.4 日期、時間類262
7.4.1 Date類262
7.4.2 Calendar類263
7.4.3 Java 8新增的日期、時間包266
7.5 正則表達式268
7.5.1 創建正則表達式268
7.5.2 使用正則表達式271
7.6 變量處理和方法處理274
7.6.1 Java 9增強的MethodHandle274
7.6.2 Java 9增加的VarHandle275
7.7 Java 9改進的國際化與格式化276
7.7.1 Java國際化的思路277
7.7.2 Java支持的國家和語言277
7.7.3 完成程序國際化278
7.7.4 使用MessageFormat處理包含占位符的字符串279
7.7.5 使用類文件代替資源文件280
7.7.6 Java 9新增的日志API281
7.7.7 使用NumberFormat格式化數字283
7.7.8 使用DateFormat格式化日期、時間284
7.7.9 使用SimpleDateFormat格式化日期286
7.8 Java 8新增的日期、時間格式器286
7.8.1 使用DateTimeFormatter完成格式化287
7.8.2 使用DateTimeFormatter解析字符串288
7.9 本章小結289
本章練習289
第8章 Java集合290
8.1 Java集合概述291
8.2 Collection和Iterator接口292
8.2.1 使用Lambda表達式遍歷集合294
8.2.2 使用Java 8增強的Iterator遍歷集合元素295
8.2.3 使用Lambda表達式遍歷Iterator296
8.2.4 使用foreach循環遍歷集合元素297
8.2.5 使用Java 8新增的Predicate操作集合297
8.2.6 使用Java 8新增的Stream操作集合298
8.3 Set集合300
8.3.1 HashSet類301
學生提問:hashCode()方法對于HashSet是不是十分重要?302
8.3.2 LinkedHashSet類304
8.3.3 TreeSet類305
8.3.4 EnumSet類311
8.3.5 各Set實現類的性能分析312
8.4 List集合313
8.4.1 Java 8改進的List接口和ListIterator接口313
8.4.2 ArrayList和Vector實現類316
8.4.3 固定長度的List317
8.5 Queue集合317
8.5.1 PriorityQueue實現類318
8.5.2 Deque接口與ArrayDeque實現類318
8.5.3 LinkedList實現類320
8.5.4 各種線性表的性能分析321
8.6 Java 8增強的Map集合322
8.6.1 Java 8為Map新增的方法324
8.6.2 Java 8改進的HashMap和Hashtable實現類325
8.6.3 LinkedHashMap實現類328
8.6.4 使用Properties讀寫屬性文件328
8.6.5 SortedMap接口和TreeMap實現類329
8.6.6 WeakHashMap實現類332
8.6.7 IdentityHashMap實現類333
8.6.8 EnumMap實現類333
8.6.9 各Map實現類的性能分析334
8.7 HashSet和HashMap的性能選項334
8.8 操作集合的工具類:Collections335
8.8.1 排序操作335
8.8.2 查找、替換操作338
8.8.3 同步控制339
8.8.4 設置不可變集合339
8.8.5 Java 9新增的不可變集合340
8.9 煩瑣的接口:Enumeration341
8.10 本章小結342
本章練習342
第9章 泛型343
9.1 泛型入門344
9.1.1 編譯時不檢查類型的異常344
9.1.2 使用泛型344
9.1.3 Java 9增強的菱形語法345
9.2 深入泛型347
9.2.1 定義泛型接口、類347
9.2.2 從泛型類派生子類348
9.2.3 并不存在泛型類349
9.3 類型通配符350
9.3.1 使用類型通配符352
9.3.2 設定類型通配符的上限352
9.3.3 設定類型通配符的下限354
9.3.4 設定泛型形參的上限356
9.4 泛型方法356
9.4.1 定義泛型方法356
9.4.2 泛型方法和類型通配符的區別359
9.4.3 Java 7的菱形語法與泛型構造器360
9.4.4 泛型方法與方法重載361
9.4.5 Java 8改進的類型推斷362
9.5 擦除和轉換362
9.6 泛型與數組364
9.7 本章小結365
第10章 異常處理366
10.1 異常概述367
10.2 異常處理機制368
10.2.1 使用try...catch捕獲異常368
10.2.2 異常類的繼承體系370
10.2.3 Java 7新增的多異常捕獲373
10.2.4 訪問異常信息373
10.2.5 使用finally回收資源374
10.2.6 異常處理的嵌套376
10.2.7 Java 9增強的自動關閉資源的try語句377
10.3 Checked異常和Runtime異常體系378
10.3.1 使用throws聲明拋出異常379
10.3.2 方法重寫時聲明拋出異常的限制380
10.4 使用throw拋出異常380
10.4.1 拋出異常380
10.4.2 自定義異常類382
10.4.3 catch和throw同時使用382
10.4.4 Java 7增強的throw語句384
10.4.5 異常鏈385
10.5 Java的異常跟蹤棧386
10.6 異常處理規則388
10.6.1 不要過度使用異常388
10.6.2 不要使用過于龐大的try塊389
10.6.3 避免使用Catch All語句390
10.6.4 不要忽略捕獲到的異常390
10.7 本章小結390
本章練習390
第11章 AWT編程391
11.1 Java 9改進的GUI(圖形用戶界面)和AWT392
11.2 AWT容器393
11.3 布局管理器396
11.3.1 FlowLayout布局管理器396
11.3.2 BorderLayout布局管理器397
學生提問:BorderLayout最多只能放置5個組件嗎?那它也太不實用了吧?398
11.3.3 GridLayout布局管理器399
11.3.4 GridBagLayout布局管理器400
11.3.5 CardLayout布局管理器402
11.3.6 絕對定位404
11.3.7 BoxLayout布局管理器405
學生提問:圖11.15和圖11.16顯示的所有按鈕都緊挨在一起,如果希望像FlowLayout、GridLayout等布局管理器那樣指定組件的間距應該怎么辦?406
11.4 AWT常用組件407
11.4.1 基本組件407
11.4.2 對話框(Dialog)409
11.5 事件處理411
11.5.1 Java事件模型的流程411
11.5.2 事件和事件監聽器413
11.5.3 事件適配器417
11.5.4 使用內部類實現監聽器418
11.5.5 使用外部類實現監聽器418
11.5.6 類本身作為事件監聽器類419
11.5.7 匿名內部類實現監聽器420
11.6 AWT菜單421
11.6.1 菜單條、菜單和菜單項421
11.6.2 右鍵菜單423
學生提問:為什么即使我沒有給多行文本域編寫右鍵菜單,但當我在多行文本域上單擊右鍵時也一樣會彈出右鍵菜單?424
11.7 在AWT中繪圖425
11.7.1 畫圖的實現原理425
11.7.2 使用Graphics類425
11.8 處理位圖430
11.8.1 Image抽象類和BufferedImage實現類430
11.8.2 Java 9增強的ImageIO432
11.9 剪貼板436
11.9.1 數據傳遞的類和接口436
11.9.2 傳遞文本437
11.9.3 使用系統剪貼板傳遞圖像438
11.9.4 使用本地剪貼板傳遞對象引用441
11.9.5 通過系統剪貼板傳遞Java對象443
11.10 拖放功能446
11.10.1 拖放目標446
11.10.2 拖放源449
11.11 本章小結451
本章練習451
第12章 Swing編程452
12.1 Swing概述453
12.2 Swing基本組件的用法454
12.2.1 Java的Swing組件層次454
12.2.2 AWT組件的Swing實現455
學生提問:為什么單擊Swing多行文本域時不是彈出像AWT多行文本域中的右鍵菜單?461
12.2.3 為組件設置邊框461
12.2.4 Swing組件的雙緩沖和鍵盤驅動463
12.2.5 使用JToolBar創建工具條464
12.2.6 使用JFileChooser和Java 7增強的JColorChooser466
12.2.7 使用JOptionPane473
12.3 Swing中的特殊容器478
12.3.1 使用JSplitPane478
12.3.2 使用JTabbedPane480
12.3.3 使用JLayeredPane、JDesktopPane和JInternalFrame484
12.4 Swing簡化的拖放功能491
12.5 Java 7新增的Swing功能492
12.5.1 使用JLayer裝飾組件492
12.5.2 創建透明、不規則形狀窗口498
12.6 使用JProgressBar、ProgressMonitor和
BoundedRangeModel創建進度條500
12.6.1 創建進度條500
12.6.2 創建進度對話框503
12.7 使用JSlider和BoundedRangeModel創建滑動條505
12.8 使用JSpinner和SpinnerModel創建微調控制器508
12.9 使用JList、JComboBox創建列表框511
12.9.1 簡單列表框511
12.9.2 不強制存儲列表項的ListModel和ComboBoxModel514
12.9.3 強制存儲列表項的DefaultListModel和 DefaultComboBoxModel517
學生提問:為什么JComboBox提供了添加、刪除列表項的方法?而JList沒有提供添加、刪除列表項的方法呢?519
12.9.4 使用ListCellRenderer改變列表項外觀519
12.10 使用JTree和TreeModel創建樹521
12.10.1 創建樹522
12.10.2 拖動、編輯樹節點524
12.10.3 監聽節點事件528
12.10.4 使用DefaultTreeCellRenderer改變節點外觀530
12.10.5 擴展DefaultTreeCellRenderer改變節點外觀531
12.10.6 實現TreeCellRenderer改變節點外觀534
12.11 使用JTable和TableModel創建表格535
12.11.1 創建表格536
學生提問:我們指定的表格數據、表格列標題都是Object類型的數組,JTable如何顯示這些Object對象?536
12.11.2 TableModel和監聽器541
12.11.3 TableColumnModel和監聽器545
12.11.4 實現排序548
12.11.5 繪制單元格內容551
12.11.6 編輯單元格內容554
12.12 使用JFormattedTextField和JTextPane創建格式文本557
12.12.1 監聽Document的變化558
12.12.2 使用JPasswordField560
12.12.3 使用JFormattedTextField560
12.12.4 使用JEditorPane568
12.12.5 使用JTextPane568
12.13 本章小結575
本章練習575
第13章 MySQL數據庫與JDBC編程576
13.1 JDBC基礎577
13.1.1 JDBC簡介577
13.1.2 JDBC驅動程序578
13.2 SQL語法579
13.2.1 安裝數據庫579
13.2.2 關系數據庫基本概念和MySQL基本命令581
13.2.3 SQL語句基礎583
13.2.4 DDL語句584
13.2.5 數據庫約束588
13.2.6 索引595
13.2.7 視圖596
13.2.8 DML語句語法597
13.2.9 單表查詢599
13.2.10 數據庫函數603
13.2.11 分組和組函數605
13.2.12 多表連接查詢607
13.2.13 子查詢611
13.2.14 集合運算612
13.3 JDBC的典型用法613
13.3.1 JDBC 4.2常用接口和類簡介613
13.3.2 JDBC編程步驟615
學生提問:前面給出的僅僅是MySQL和Oracle兩種數據庫的驅動,我看不出驅動類字符串有什么規律啊。如果我希望使用其他數據庫,那怎么找到其他數據庫的驅動類呢?616
13.4 執行SQL語句的方式618
13.4.1 使用Java 8新增的executeLargeUpdate方法執行DDL和DML語句618
13.4.2 使用execute方法執行SQL語句620
13.4.3 使用PreparedStatement執行SQL語句621
13.4.4 使用CallableStatement調用存儲過程626
13.5 管理結果集627
13.5.1 可滾動、可更新的結果集627
13.5.2 處理Blob類型數據629
13.5.3 使用ResultSetMetaData分析結果集634
13.6 Javar的RowSet636
13.6.1 Java 7新增的RowSetFactory與RowSet637
13.6.2 離線RowSet638
13.6.3 離線RowSet的查詢分頁640
13.7 事務處理641
13.7.1 事務的概念和MySQL事務支持641
13.7.2 JDBC的事務支持643
13.7.3 Java 8增強的批量更新645
13.8 分析數據庫信息646
13.8.1 使用DatabaseMetaData分析數據庫信息646
13.8.2 使用系統表分析數據庫信息648
13.8.3 選擇合適的分析方式649
13.9 使用連接池管理連接649
13.9.1 DBCP數據源650
13.9.2 C3P0數據源651
13.10 本章小結651
本章練習651
第14章 注解(Annotation)652
14.1 基本注解653
14.1.1 限定重寫父類方法:@Override653
14.1.2 Java 9增強的@Deprecated654
14.1.3 抑制編譯器警告:@SuppressWarnings655
14.1.4 堆污染警告與Java 9增強的@SafeVarargs655
14.1.5 Java 8的函數式接口與@FunctionalInterface656
14.2 JDK的元注解657
14.2.1 使用@Retention657
14.2.2 使用@Target658
14.2.3 使用@Documented658
14.2.4 使用@Inherited659
14.3 自定義注解660
14.3.1 定義注解660
14.3.2 提取注解信息661
14.3.3 使用注解的示例663
14.3.4 Java 8新增的重復注解667
14.3.5 Java 8新增的類型注解669
14.4 編譯時處理注解670
14.5 本章小結674
第15章 輸入/輸出675
15.1 File類676
15.1.1 訪問文件和目錄676
15.1.2 文件過濾器678
15.2 理解Java的IO流679
15.2.1 流的分類679
15.2.2 流的概念模型680
15.3 字節流和字符流681
15.3.1 InputStream和Reader681
15.3.2 OutputStream和Writer683
15.4 輸入/輸出流體系685
15.4.1 處理流的用法685
15.4.2 輸入/輸出流體系686
15.4.3 轉換流688
學生提問:怎么沒有把字符流轉換成字節流的轉換流呢?688
15.4.4 推回輸入流689
15.5 重定向標準輸入/輸出690
15.6 Java虛擬機讀寫其他進程的數據691
15.7 RandomAccessFile694
15.8 Java 9改進的對象序列化697
15.8.1 序列化的含義和意義697
15.8.2 使用對象流實現序列化697
15.8.3 對象引用的序列化699
15.8.4 Java 9增加的過濾功能703
15.8.5 自定義序列化704
15.8.6 另一種自定義序列化機制709
15.8.7 版本710
15.9 NIO711
15.9.1 Java新IO概述711
15.9.2 使用Buffer712
15.9.3 使用Channel715
15.9.4 字符集和Charset717
學生提問:二進制序列與字符之間如何對應呢?718
15.9.5 文件鎖720
15.10 Java 7的NIO.2721
15.10.1 Path、Paths和Files核心API721
15.10.2 使用FileVisitor遍歷文件和目錄723
15.10.3 使用WatchService監控文件變化724
15.10.4 訪問文件屬性725
15.11 本章小結726
本章練習727
第16章 多線程728
16.1 線程概述729
16.1.1 線程和進程729
16.1.2 多線程的優勢730
16.2 線程的創建和啟動731
16.2.1 繼承Thread類創建線程類731
16.2.2 實現Runnable接口創建線程類732
16.2.3 使用Callable和Future創建線程733
16.2.4 創建線程的三種方式對比735
16.3 線程的生命周期735
16.3.1 新建和就緒狀態735
16.3.2 運行和阻塞狀態737
16.3.3 線程死亡738
16.4 控制線程739
16.4.1 join線程739
16.4.2 后臺線程740
16.4.3 線程睡眠:sleep741
16.4.4 改變線程優先級742
16.5 線程同步743
16.5.1 線程安全問題743
16.5.2 同步代碼塊745
16.5.3 同步方法747
16.5.4 釋放同步監視器的鎖定749
16.5.5 同步鎖(Lock)749
16.5.6 死鎖751
16.6 線程通信753
16.6.1 傳統的線程通信753
16.6.2 使用Condition控制線程通信756
16.6.3 使用阻塞隊列(BlockingQueue)控制線程通信758
16.7 線程組和未處理的異常761
16.8 線程池764
16.8.1 Java 8改進的線程池764
16.8.2 Java 8增強的ForkJoinPool766
16.9 線程相關類769
16.9.1 ThreadLocal類769
16.9.2 包裝線程不安全的集合771
16.9.3 線程安全的集合類771
16.9.4 Java 9新增的發布-訂閱框架772
16.10 本章小結774
本章練習775
第17章 網絡編程776
17.1 網絡編程的基礎知識777
17.1.1 網絡基礎知識777
17.1.2 IP地址和端口號778
17.2 Java的基本網絡支持779
17.2.1 使用InetAddress779
17.2.2 使用URLDecoder和URLEncoder780
17.2.3 URL、URLConnection和URLPermission781
17.3 基于TCP協議的網絡編程787
17.3.1 TCP協議基礎787
17.3.2 使用ServerSocket創建TCP服務器端788
17.3.3 使用Socket進行通信788
17.3.4 加入多線程791
17.3.5 記錄用戶信息793
17.3.6 半關閉的Socket801
17.3.7 使用NIO實現非阻塞Socket通信802
17.3.8 使用Java 7的AIO實現非阻塞通信807
17.4 基于UDP協議的網絡編程814
17.4.1 UDP協議基礎814
17.4.2 使用DatagramSocket發送、接收數據814
17.4.3 使用MulticastSocket實現多點廣播818
17.5 使用代理服務器828
17.5.1 直接使用Proxy創建連接829
17.5.2 使用ProxySelector自動選擇代理服務器830
17.6 本章小結832
本章練習832
第18章 類加載機制與反射833
18.1 類的加載、連接和初始化834
18.1.1 JVM和類834
18.1.2 類的加載835
18.1.3 類的連接836
18.1.4 類的初始化836
18.1.5 類初始化的時機837
18.2 類加載器838
18.2.1 類加載機制838
18.2.2 創建并使用自定義的類加載器840
18.2.3 URLClassLoader類843
18.3 通過反射查看類信息844
18.3.1 獲得Class對象845
18.3.2 從Class中獲取信息845
18.3.3 Java 8新增的方法參數反射849
18.4 使用反射生成并操作對象850
18.4.1 創建對象850
18.4.2 調用方法852
18.4.3 訪問成員變量值854
18.4.4 操作數組855
18.5 使用反射生成JDK動態代理857
18.5.1 使用Proxy和InvocationHandler創建動態代理857
18.5.2 動態代理和AOP859
18.6 反射和泛型862
18.6.1 泛型和Class類862
18.6.2 使用反射來獲取泛型信息864
18.7 本章小結865
本章練習866
附錄A Java 9的模塊化系統867