第1章 Java語言概述與開發環境 1
1.1 Java語言的發展簡史 2
1.2 Java程序運行機製 4
1.2.1 高級語言的運行機製 4
1.2.2 Java程序的運行機製和JVM 4
1.3 開發Java的準備 5
1.3.1 下載和安裝Java 8的JDK 5
不是說JVM是運行Java程序的虛擬機嗎?那JRE和JVM的關係是怎樣的呢? 6
1.3.2 設置PATH環境變量 8
為什麼不安裝公共JRE呢? 7
為什麼選擇用戶變量?用戶變量與係統變量有什麼區彆? 9
1.4 第一個Java程序 9
1.4.1 編輯Java源代碼 9
1.4.2 編譯Java程序 10
當編譯C程序時,不僅需要指定存放目標文件的位置,也需要指定目標文件的文件名,這裏使用javac編譯Java程序時怎麼不需要指定目標文件的文件名呢? 10
1.4.3 運行Java程序 11
1.4.4 根據CLASSPATH環境變量定位類 11
1.5 Java程序的基本規則 12
1.5.1 Java程序的組織形式 12
1.5.2 Java源文件的命名規則 13
1.5.3 初學者容易犯的錯誤 13
1.6 何時開始使用IDE工具 15
我想學習Java編程,到底是學習Eclipse好,還是學習NetBeans好呢? 16
1.7 本章小結 16
本章練習 16
第2章 數據類型和運算符 17
2.1 注釋 18
2.1.1 單行注釋和多行注釋 18
2.1.2 文檔注釋 19
API文檔是什麼? 19
為什麼要學習查看API文檔的方法? 21
2.2 標識符和關鍵字 24
2.2.1 分隔符 24
2.2.2 標識符規則 25
2.2.3 Java關鍵字 26
2.3 數據類型分類 26
什麼是變量?變量有什麼用? 26
2.4 基本數據類型 27
2.4.1 整型 27
2.4.2 字符型 29
什麼是字符集? 29
2.4.3 浮點型 31
2.4.4 數值中使用下畫綫分隔 32
2.4.5 布爾型 32
2.5 基本類型的類型轉換 33
2.5.1 自動類型轉換 33
2.5.2 強製類型轉換 34
2.5.3 錶達式類型的自動提升 35
2.6 直接量 36
2.6.1 直接量的類型 36
2.6.2 直接量的賦值 37
2.7 運算符 38
2.7.1 算術運算符 38
2.7.2 賦值運算符 40
2.7.3 位運算符 41
2.7.4 擴展後的賦值運算符 43
2.7.5 比較運算符 43
2.7.6 邏輯運算符 44
2.7.7 三目運算符 45
2.7.8 運算符的結閤性和優先級 46
2.8 本章小結 47
本章練習 47
第3章 流程控製與數組 48
3.1 順序結構 49
3.2 分支結構 49
3.2.1 if條件語句 49
3.2.2 增強後的switch分支語句 53
3.3 循環結構 54
3.3.1 while循環語句 55
3.3.2 do while循環語句 56
3.3.3 for循環 57
3.3.4 嵌套循環 59
3.4 控製循環結構 60
3.4.1 使用break結束循環 60
3.4.2 使用continue忽略本次循環剩下語句 61
3.4.3 使用return結束方法 62
3.5 數組類型 63
3.5.1 理解數組:數組也是一種類型 63
int[]是一種類型嗎?怎麼使用這種類型呢? 63
3.5.2 定義數組 63
3.5.3 數組的初始化 64
能不能隻分配內存空間,不賦初始值呢? 64
3.5.4 使用數組 65
為什麼要我記住這些異常信息? 66
3.5.5 foreach循環 66
3.6 深入數組 68
3.6.1 沒有多維數組 68
我是否可以讓圖3.3中灰色覆蓋的數組元素再次指嚮另一個數組?這樣不就可以擴展成三維數組,甚至擴展成更多維的數組嗎? 69
3.6.2 Java 8增強的工具類:Arrays 70
3.7 本章小結 73
本章練習 73
第4章 麵嚮對象(上) 74
4.1 類和對象 75
4.1.1 定義類 75
構造器不是沒有返迴值嗎?為什麼不能用void聲明呢? 77
4.1.2 對象的産生和使用 77
4.1.3 對象、引用和指針 78
4.1.4 對象的this引用 79
4.2 方法詳解 83
4.2.1 方法的所屬性 83
4.2.2 方法的參數傳遞機製 83
4.2.3 形參個數可變的方法 87
4.2.4 遞歸方法 88
4.2.5 方法重載 89
為什麼方法的返迴值類型不能用於區分重載的方法? 90
4.3 成員變量和局部變量 90
4.3.1 成員變量和局部變量 90
4.3.2 成員變量的初始化和內存中的運行機製 94
4.3.3 局部變量的初始化和內存中的運行機製 95
4.3.4 變量的使用規則 96
4.4 隱藏和封裝 97
4.4.1 理解封裝 97
4.4.2 使用訪問控製符 97
4.4.3 package、import和import static 100
4.4.4 Java的常用包 104
4.5 深入構造器 105
4.5.1 使用構造器執行初始化 105
構造器是創建Java對象的途徑,是不是說構造器完全負責創建Java對象? 106
4.5.2 構造器重載 106
為什麼要用this來調用另一個重載的構造器?我把另一個構造器裏的代碼復製、粘貼到這個構造器裏不就可以瞭嗎? 107
4.6 類的繼承 108
4.6.1 繼承的特點 108
4.6.2 重寫父類的方法 109
4.6.3 super限定 110
4.6.4 調用父類構造器 112
為什麼我創建Java對象時從未感覺到java.lang. Object類的構造器被調用過? 114
4.7 多態 115
4.7.1 多態性 115
4.7.2 引用變量的強製類型轉換 116
4.7.3 instanceof運算符 117
4.8 初始化塊 118
4.8.1 使用初始化塊 118
4.8.2 初始化塊和構造器 120
4.8.3 靜態初始化塊 120
4.9 本章小結 123
本章練習 123
第5章 麵嚮對象(下) 124
5.1 Java 8增強的包裝類 125
Java為什麼要對這些數據進行緩存呢? 128
5.2 處理對象 129
5.2.1 打印對象和toString方法 129
5.2.2 ==和equals方法 130
上麵程序中判斷obj是否為Person類的實例時,為何不用obj instanceof Person來判斷呢? 134
5.3 類成員 134
5.3.1 理解類成員 134
5.3.2 單例(Singleton)類 135
5.4 final修飾符 136
5.4.1 final成員變量 136
5.4.2 final局部變量 138
5.4.3 final修飾基本類型變量和引用類型變量的區彆 139
5.4.4 可執行“宏替換”的final變量 139
5.4.5 final方法 141
5.4.6 final類 142
5.5 抽象類 142
5.5.1 抽象方法和抽象類 142
5.5.2 抽象類的作用 145
5.6 Java 8改進的接口 146
5.6.1 接口的概念 146
5.6.2 Java 8中接口的定義 147
5.6.3 接口的繼承 149
5.6.4 使用接口 149
5.6.5 接口和抽象類 151
5.7 內部類 152
5.7.1 非靜態內部類 152
非靜態內部類對象和外部類對象的關係是怎樣的? 155
5.7.2 靜態內部類 156
為什麼靜態內部類的實例方法也不能訪問外部類的實例屬性呢? 157
接口裏是否能定義內部接口? 158
5.7.3 使用內部類 158
既然內部類是外部類的成員,那麼是否可以為外部類定義子類,在子類中再定義一個內部類來重寫其父類中的內部類呢? 160
5.7.4 局部內部類 160
5.7.5 Java 8改進的匿名內部類 161
5.8 Java 8新增的Lambda錶達式 164
5.8.1 Lambda錶達式入門 164
5.8.2 Lambda錶達式與函數式接口 166
5.8.3 方法引用與構造器引用 168
5.8.4 Lambda錶達式與匿名內部類的聯係和區彆 171
5.8.5 使用Lambda錶達式調用Arrays的類方法 172
5.9 枚舉類 172
5.9.1 手動實現枚舉類 173
5.9.2 枚舉類入門 173
5.9.3 枚舉類的成員變量、方法和構造器 175
5.9.4 實現接口的枚舉類 177
枚舉類不是用final修飾瞭嗎?怎麼還能派生子類呢? 178
5.9.5 包含抽象方法的枚舉類 178
5.10 修飾符的適用範圍 179
5.11 本章小結 180
本章練習 180
第6章 Java基礎類庫 181
6.1 與用戶互動 182
6.1.1 運行Java程序的參數 182
6.1.2 使用Scanner獲取鍵盤輸入 183
6.2 係統相關 185
6.2.1 System類 185
6.2.2 Runtime類 187
6.3 常用類 188
6.3.1 Object類 188
6.3.2 Objects類 189
6.3.3 String、StringBuffer和StringBuilder類 190
6.3.4 Math類 193
6.3.5 ThreadLocalRandom與Random 195
6.3.6 BigDecimal類 196
6.4 Java 8的日期、時間類 199
6.4.1 Date類 199
6.4.2 Calendar類 199
6.4.3 Java 8新增的日期、時間包 202
6.5 Java 8新增的日期、時間格式器 204
6.5.1 使用DateTimeFormatter完成格式化 205
6.5.2 使用DateTimeFormatter解析字符串 206
6.6 本章小結 206
本章練習 206
第7章 Java集閤 207
7.1 Java集閤概述 208
7.2 Collection和Iterator接口 209
7.2.1 使用Lambda錶達式遍曆集閤 211
7.2.2 使用Java 8增強的Iterator遍曆集閤元素 211
7.2.3 使用Lambda錶達式遍曆Iterator 213
7.2.4 使用foreach循環遍曆集閤元素 213
7.2.5 使用Java 8新增的Predicate操作集閤 214
7.2.6 使用Java 8新增的Stream操作集閤 215
7.3 Set集閤 217
7.3.1 HashSet類 217
hashCode()方法對於HashSet是不是十分重要? 219
7.3.2 LinkedHashSet類 221
7.3.3 TreeSet類 222
7.4 List集閤 227
7.4.1 Java 8改進的List接口和ListIterator接口 227
7.4.2 ArrayList和Vector實現類 231
7.4.3 固定長度的List 231
7.5 Queue集閤 232
7.5.1 PriorityQueue實現類 232
7.5.2 Deque接口與ArrayDeque實現類 233
7.5.3 LinkedList實現類 235
7.5.4 各種綫性錶的性能分析 236
7.6 Java 8增強的Map集閤 236
7.6.1 Java 8為Map新增的方法 238
7.6.2 Java 8改進的HashMap和Hashtable實現類 239
7.6.3 LinkedHashMap實現類 242
7.6.4 使用Properties讀寫屬性文件 243
7.6.5 SortedMap接口和TreeMap實現類 244
7.6.6 各Map實現類的性能分析 246
7.7 HashSet和HashMap的性能選項 246
7.8 操作集閤的工具類:Collections 247
7.8.1 排序操作 247
7.8.2 查找、替換操作 250
7.8.3 同步控製 251
7.8.4 設置不可變集閤 251
7.9 煩瑣的接口:Enumeration 252
7.10 本章小結 253
本章練習 253
第8章 泛型 254
8.1 泛型入門 255
8.1.1 編譯時不檢查類型的異常 255
8.1.2 使用泛型 255
8.1.3 泛型的“菱形”語法 256
8.2 深入泛型 257
8.2.1 定義泛型接口、類 257
8.2.2 從泛型類派生子類 259
8.2.3 並不存在泛型類 260
8.3 類型通配符 260
8.3.1 使用類型通配符 262
8.3.2 設定類型通配符的上限 262
8.3.3 設定類型形參的上限 264
8.4 泛型方法 264
8.4.1 定義泛型方法 265
8.4.2 泛型方法和類型通配符的區彆 267
8.4.3 “菱形”語法與泛型構造器 268
8.4.4 設定通配符下限 269
8.4.5 泛型方法與方法重載 271
8.4.6 Java 8改進的類型推斷 272
8.5 擦除和轉換 272
8.6 泛型與數組 274
8.7 本章小結 275
第9章 異常處理 276
9.1 異常概述 277
9.2 異常處理機製 278
9.2.1 使用try...catch捕獲異常 278
9.2.2 異常類的繼承體係 279
9.2.3 多異常捕獲 282
9.2.4 訪問異常信息 282
9.2.5 使用finally迴收資源 283
9.2.6 異常處理的嵌套 285
9.2.7 自動關閉資源的try語句 286
9.3 Checked異常和Runtime異常體係 287
9.3.1 使用throws聲明拋齣異常 287
9.4 使用throw拋齣異常 289
9.4.1 拋齣異常 289
9.4.2 自定義異常類 290
9.4.3 catch和throw同時使用 291
9.4.4 增強的throw語句 292
9.4.5 異常鏈 293
9.5 Java的異常跟蹤棧 294
9.6 異常處理規則 296
9.6.1 不要過度使用異常 296
9.6.2 不要使用過於龐大的try塊 297
9.6.3 避免使用Catch All語句 298
9.6.4 不要忽略捕獲到的異常 298
9.7 本章小結 298
本章練習 298
第10章 Annotation(注解) 299
10.1 基本Annotation 300
10.1.1 限定重寫父類方法:@Override 300
10.1.2 標示已過時:@Deprecated 301
10.1.3 抑製編譯器警告:@SuppressWarnings 302
10.1.4 “堆汙染”警告與@SafeVarargs 302
10.1.5 Java 8的函數式接口與@FunctionalInterface 303
10.2 JDK的元Annotation 304
10.2.1 使用@Retention 304
10.2.2 使用@Target 305
10.2.3 使用@Documented 305
10.2.4 使用@Inherited 306
10.3 自定義Annotation 307
10.3.1 定義Annotation 307
10.3.2 提取Annotation信息 308
10.3.3 使用Annotation的示例 310
10.3.4 Java 8新增的重復注解 314
10.3.5 Java 8新增的Type Annotation 316
10.4 編譯時處理Annotation 317
10.5 本章小結 320
第11章 輸入/輸齣 321
11.1 File類 322
11.1.1 訪問文件和目錄 322
11.1.2 文件過濾器 324
11.2 理解Java的IO流 324
11.2.1 流的分類 325
11.2.2 流的概念模型 326
11.3 字節流和字符流 327
11.3.1 InputStream和Reader 327
11.3.2 OutputStream和Writer 329
11.4 輸入/輸齣流體係 330
11.4.1 處理流的用法 330
11.4.2 輸入/輸齣流體係 331
11.4.3 轉換流 333
怎麼沒有把字符流轉換成字節流的轉換流呢? 334
11.4.4 推迴輸入流 334
11.5 重定嚮標準輸入/輸齣 336
11.6 RandomAccessFile 337
11.7 NIO.2 340
11.7.1 Path、Paths和Files核心API 341
11.7.2 使用FileVisitor遍曆文件和目錄 342
11.7.3 使用WatchService監控文件變化 343
11.7.4 訪問文件屬性 344
11.8 本章小結 346
本章練習 346
第12章 多綫程 347
12.1 綫程概述 348
12.1.1 綫程和進程 348
12.1.2 多綫程的優勢 349
12.2 綫程的創建和啓動 349
12.2.1 繼承Thread類創建綫程類 350
12.2.2 實現Runnable接口創建綫程類 351
12.2.3 使用Callable和Future創建綫程 352
12.2.4 創建綫程的三種方式對比 354
12.3 綫程的生命周期 354
12.3.1 新建和就緒狀態 354
12.3.2 運行和阻塞狀態 356
12.3.3 綫程死亡 357
12.4 控製綫程 358
12.4.1 join綫程 358
12.4.2 後颱綫程 359
12.4.3 綫程睡眠:sleep 360
12.4.4 綫程讓步:yield 360
12.4.5 改變綫程優先級 362
12.5 綫程同步 363
12.5.1 綫程安全問題 363
12.5.2 同步代碼塊 365
12.5.3 同步方法 366
12.5.4 釋放同步監視器的鎖定 368
12.5.5 同步鎖(Lock) 369
12.5.6 死鎖 371
12.6 綫程通信 372
12.6.1 傳統的綫程通信 372
12.6.2 使用Condition控製綫程通信 376
12.6.3 使用阻塞隊列(BlockingQueue)控製綫程通信 378
12.7 綫程池 380
12.7.1 Java 8改進的綫程池 381
12.7.2 Java 8增強的ForkJoinPool 382
12.8 綫程相關類 386
12.8.1 ThreadLocal類 386
12.8.2 包裝綫程不安全的集閤 387
12.8.3 綫程安全的集閤類 388
12.9 本章小結 389
本章練習 389
第13章 網絡編程 390
13.1 網絡編程的基礎知識 391
13.1.1 網絡基礎知識 391
13.1.2 IP地址和端口號 392
13.2 Java的基本網絡支持 393
13.2.1 使用InetAddress 393
13.2.2 使用URLDecoder和URLEncoder 393
13.2.3 URL、URLConnection和URLPermission 395
13.3 基於TCP協議的網絡編程 401
13.3.1 TCP協議基礎 401
13.3.2 使用ServerSocket創建TCP服務器端 401
13.3.3 使用Socket進行通信 402
13.3.4 加入多綫程 404
13.3.5 記錄用戶信息 407
13.3.6 半關閉的Socket 414
13.3.7 使用NIO實現非阻塞Socket通信 415
13.3.8 使用AIO實現非阻塞通信 420
上麵程序中好像沒用到④⑤號代碼的get()方法的返迴值,這兩個地方不調用get()方法行嗎? 424
13.4 使用代理服務器 427
13.4.1 直接使用Proxy創建連接 427
13.4.2 使用ProxySelector自動選擇代理服務器 428
13.5 本章小結 431
本章練習 431
· · · · · · (
收起)