本書是Java語言的經典教材,中文版分為基礎篇和進階篇,主要介紹程序設計基礎、面向對象程序設計、GUI程序設計、數據結構和算法、高級Java程序設計等內容。本書可作為高等院校相關專業程序設計課程的基礎教材,也可作為Java語言及編程愛好者的參考資料。
Introduction to Java Programming, Comprehensive Version, Tenth Edition許多讀者就本書之前的版本給出了很多反饋。這些評論和建議極大地改進了本書。這一版在表述、組織、示例、練習題以及附錄方面都進行了極大的增強,包括:
用JavaFX取代了Swing。JavaFX是一個用于開發Java GUI程序的新框架,它極大地簡化了GUI程序設計,比Swing更易于學習。
在GUI程序設計之前介紹異常處理、抽象類和接口,若教師選擇不教授GUI的內容,可以直接跳過第14~16章。
在第4章便開始介紹對象和字符題串,從而使得學生可以較早地使用對象和字符串來開發有趣的程序。
包含更多新的有趣示例和練習題 ,用于激發學生興趣。在配套網站(www.cs. armstrong.edu/liang/intro10e/或www.pearsonhighered.com/liang)上還為教師提供了100多道編程練習題。
本書采用基礎優先的方法,在設計自定義類之前,首先介紹基本的程序設計概念和技術。選擇語句、循環、方法和數組這樣的基本概念和技術是程序設計的基礎,它們為學生進一步學習面向對象程序設計和高級Java程序設計做好準備。
本書以問題驅動的方式來教授程序設計,將重點放在問題的解決而不是語法上。我們通過使用在各種應用情景中引發思考的問題,使得程序設計的介紹也變得更加有趣。前面章節的主線放在問題的解決上,引入合適的語法和庫以支持編寫解決問題的程序。為了支持以問題驅動的方式來教授程序設計,本書提供了大量不同難度的問題來激發學生的積極性。為了吸引各個專業的學生來學習,這些問題涉及很多應用領域,包括數學、科學、商業、金融、游戲、動畫以及多媒體等。
本書將程序設計、數據結構和算法無縫集成在一起,采用一種實用性的方式來教授數據結構。首先介紹如何使用各種數據結構來開發高效的算法,然后演示如何實現這些數據結構。通過實現,學生獲得關于數據結構效率,以及如何和何時使用某種數據結構的深入理解。最后,我們設計和實現了針對樹和圖的自定義數據結構。
本書廣泛應用于全球各大學的程序設計入門、數據結構和算法課程中。完全版包括程序設計基礎、面向對象程序設計、GUI程序設計、數據結構、算法、并行、網絡、數據庫和Web程序設計。這個版本旨在把學生培養成精通Java的程序員。基礎篇可用于程序設計的第一門課程(通常稱為CS1)。基礎篇包含完全版的前18章內容,前13章適合準備AP計算機科學考試(AP Computer Science Exam)的人員使用。
教授編程的最好途徑是通過示例,而學習編程的唯一途徑是通過動手練習。本書通過示例對基本概念進行了解釋,提供了大量不同難度的練習題供學生進行實踐。在我們的程序設計課程中,每次課后都布置了編程練習。
我們的目標是編寫一本可以通過各種應用場景中的有趣示例來教授問題求解和程序設計的教材。如果您有任何關于如何改進本書的評論或建議,請通過以下方式與我聯系。
Y. Daniel Liangy.daniel.liang@gmail.comwww.cs.armstrong.edu/liangwww.pearsonhighered.com/liang本版新增內容本版對各個細節都進行了全面修訂,以增強其清晰性、表述、內容、例子和練習題。本版主要的改進如下:
更新到Java 8版本。
由于Swing被JavaFX所替代,因此所有的GUI示例和練習題都使用JavaFX改寫。
使用lambda表達式來簡化JavaFX和線程中的編程。
在配套網站上為教師提供了100多道編程練習題,并給出了答案。這些練習題沒有出現在教材中。
在第4章就引入了數學方法,使得學生可以使用數學函數編寫代碼。
在第4章就引入了字符串,使得學生可以早點使用對象和字符串開發有趣的程序。
GUI編程放在抽象類和接口之后介紹,若教師選擇不教授GUI內容的話,可以直接跳過這些章節。
第4、14、15和16章是全新的章節。
第28和29章大幅改寫,對最小生成樹和最短路徑使用更加簡化的方法實現。
教學特色本書使用以下要素組織素材:
教學目標 在每章開始處列出學生應該掌握的內容,學完這章后,學生能夠判斷自己是否達到這個目標。
引言 提出代表性的問題,以便學生對該章內容有一個概括了解。
要點提示 突出每節中涵蓋的重要概念。
復習題 按節組織,幫助學生復習相關內容并評估掌握的程度。
示例學習 通過精心挑選示例,以容易理解的方式教授問題求解和程序設計概念。本書使用多個小的、簡單的、激發興趣的例子來演示重要的概念。
本章小結 回顧學生應該理解和記住的重要主題,有助于鞏固該章所學的關鍵概念。
測試題 測試題是在線的,讓學生對編程概念和技術進行自我測試。
編程練習題 為學生提供獨立應用所學新技能的機會。練習題的難度分為容易(沒有星號)、適中(*)、難(**)和具有挑戰性(***)四個級別。學習程序設計的竅門就是實踐、實踐、再實踐。所以,本書提供了大量的編程練習題。
注意、提示、警告和設計指南 貫穿全書,對程序開發的重要方面提供有價值的建議和見解。
注意 提供學習主題的附加信息,鞏固重要概念。
提示 教授良好的程序設計風格和實踐經驗。
警告 幫助學生避開程序設計錯誤的誤區。
設計指南 提供設計程序的指南。
靈活的章節順序本書提供靈活的章節順序,使學生可以或早或晚地了解GUI、異常處理、遞歸、泛型和Java集合框架等內容。下頁的插圖顯示了各章之間的相關性。
本書的組織所有的章節分為五部分,構成Java程序設計、數據結構和算法、數據庫和Web程序設計的全面介紹。因為知識是循序漸進的,前面的章節介紹了程序設計的基本概念,并且通過簡單的例子和練習題指導學生;后續的章節逐步詳細地介紹Java程序設計,最后介紹開發綜合的Java應用程序。附錄包含各種主題,包含數系、位操作、正則表達式以及枚舉類型。
第一部分 程序設計基礎(第1~8章)本書第一部分是基石,讓你開始踏上Java學習之旅。你將開始了解Java(第1章),還將學習像基本數據類型、變量、常量、賦值、表達式以及操作符這樣的基本程序設計技術(第2章),選擇語句(第3章),數學函數、字符和字符串(第4章),循環(第5章),方法(第6章),數組(第7~8章)。在第7章之后,可以跳到第18章去學習如何編寫遞歸的方法來解決本身具有遞歸特性的問題。
第二部分 面向對象程序設計(第9~13章和第17章)這一部分介紹面向對象程序設計。Java是一種面向對象程序設計語言,它使用抽象、封裝、繼承和多態來提供開發軟件的極大靈活性、模塊化和可重用性。你將學習如何使用對象和類進行程序設計(第9~10章)、類的繼承(第11章)、多態性(第11章)、異常處理(第12章)、抽象類(第13章)以及接口(第13章)。文本I/O將在第12章介紹,二進制I/O將在第17章介紹。
第三部分 GUI程序設計(第14~16章和獎勵章節第34章)JavaFX是一個開發Java GUI程序的新框架。它不僅對于開發GUI程序有用,還是一個用于學習面向對象程序設計的優秀教學工具。這一部分中在第14~16章介紹使用JavaFX的Java GUI程序設計。主要的主題包括GUI基礎(第14章)、容器面板(第14章)、繪制形狀(第14章)、事件驅動編程(第15章)、動畫(第15章)、GUI組件(第16章),以及播放音頻和視頻(第16章)。你將學習采用JavaFX的GUI程序設計的架構,并且使用組件、形狀、面板、圖像和視頻來開發有用的應用程序。第34章涵蓋JavaFX的高級特性。
第四部分 數據結構和算法(第18~29章和獎勵章節第40~41章)這一部分介紹經典數據結構和算法課程中的主要內容。第18章介紹遞歸來編寫解決本身具有遞歸特性的問題的方法。第19章介紹泛型來提高軟件的可靠性。第20和21章介紹Java合集框架,它為數據結構定義了一套有用的API。第22章討論算法效率的度量以便給應用程序選擇合適的算法。第23章介紹經典的排序算法。你將在第24章中學到如何實現經典的數據結構,如線性表、隊列和優先隊列。第25和26章介紹二叉查找樹和AVL樹。第27章介紹散列以及通過散列實現映射表(map)和集合(set)。第28和29章介紹圖的應用。2-4樹、B樹以及紅黑樹在獎勵章節第40~41章中介紹。
第五部分 高級Java程序設計(第30~33章、獎勵章節第35~39章及第42章)這一部分介紹高級Java程序設計。第30章介紹使用多線程使程序具有更好的響應和交互性,并介紹并行編程。第31章討論如何編寫程序使得Internet上的不同主機能夠相互對話。第32章介紹使用Java來開發數據庫項目。第33章介紹使用JavaServer Faces進行現代Web應用程序開發。第35章探究高級Java數據庫程序設計。第36章涵蓋國際化支持的使用,以開發面向全球使用者的項目。第37和38章介紹如何使用Java servlet和JSP創建來自Web服務器的動態內容。第39章討論Web服務。第42章介紹使用JUnit測試Java程序。
附錄附錄A列出Java關鍵字。附錄B給出十進制和十六進制ASCII字符集。附錄C給出操作符優先級。附錄D總結Java修飾符和它們的使用。附錄E討論特殊的浮點值。附錄F介紹數系以及二進制、十進制和十六進制間的轉換。附錄G介紹位操作。附錄H介紹正則表達式。附錄I涵蓋枚舉類型。
Java開發工具可以使用Windows記事本(NotePad)或寫字板(WordPad)這樣的文本編輯器創建Java程序,然后從命令窗口編譯、運行這個程序。也可以使用Java開發工具,例如, NetBeans或者Eclipse。這些工具支持快速開發Java應用程序的集成開發環境(IDE),編輯、編譯、構建、運行和調試程序都集成在一個圖形用戶界面中。有效地使用這些工具可以極大地提高編寫程序的效率。如果按照教程學習,NetBeans和Eclipse也是易于使用的。關于NetBeans和Eclipse的教程,參見配套網站。
學生資源學生資源可以從本書的配套網站得到,具體包括:
復習題的答案。
偶數號編程練習題的解答。
本書例子的源代碼。
交互式的自測題(按章節組織)。
補充材料。
調試技巧。
算法動畫。
勘誤表。
教師資源教師資源包括:
PowerPoint教學幻燈片,通過交互性的按鈕可以觀看彩色并且語法項高亮顯示的源代碼,并可以不離開幻燈片運行程序。
所有編程練習題的答案。學生只可以得到偶數號練習題的答案。
100多道編程練習題,按章節組織。這些練習題僅對教師開放,并提供答案。
基于Web的測試題生成器。(教師可以選擇章節以從2000多個大型題庫中生成測試題。)樣卷。大多數試卷包含4個部分:
多選題或者簡答題。
改正編程錯誤。
跟蹤程序。
編寫程序。
ACM/IEEE課程體系2013版。新的ACM/IEEE計算機科學課程體系2013版將知識主體組織成18個知識領域。為了幫助教師基于本書設計課程,我們提供了示例教學大綱來確定知識領域和知識單元。示例教學大綱用于一個三學期的課程系列,作為一個學院自定義(institutional customization)示例。
具有ABET課程評價的樣卷。
課程項目。通常,每個項目給出一個描述,并且要求學生分析、設計和實現該項目。
Introduction to Java Programming, Comprehensive Version, Tenth Edition
出版者的話
中文版序
譯者序
前言
第19章 泛型 1
19.1 引言 1
19.2 動機和優點 1
19.3 定義泛型類和接口 4
19.4 泛型方法 5
19.5 示例學習:對一個對象數組進行排序 7
19.6 原始類型和向后兼容 8
19.7 通配泛型 10
19.8 消除泛型和對泛型的限制 12
19.9 示例學習:泛型矩陣類 15
關鍵術語 19
本章小結 19
測試題 20
編程練習題 20
第20章 線性表、棧、隊列和優先隊列 21
20.1 引言 21
20.2 合集 21
20.3 迭代器 25
20.4 線性表 26
20.4.1 List接口中的通用方法 26
20.4.2 數組線性表類ArrayList和鏈表類LinkedList 27
20.5 Comparator接口 30
20.6 線性表和合集的靜態方法 32
20.7 示例學習:彈球 35
20.8 向量類和棧類 38
20.9 隊列和優先隊列 40
20.9.1 Queue接口 40
20.9.2 雙端隊列Deque和鏈表LinkedList 40
20.10 示例學習:表達式求值 43
關鍵術語 47
本章小結 47
測試題 47
編程練習題 47
第21章 集合和映射表 53
21.1 引言 53
21.2 集合 53
21.2.1 HashSet 54
21.2.2 LinkedHashSet 57
21.2.3 TreeSet 58
21.3 比較集合和線性表的性能 61
21.4 示例學習:統計關鍵字 63
21.5 映射表 65
21.6 示例學習:單詞的出現次數 69
21.7 單元素與不可變的合集和映射表 71
關鍵術語 72
本章小結 72
測試題 72
編程練習題 72
第22章 開發高效算法 75
22.1 引言 75
22.2 使用大O符號來衡量算法效率 75
22.3 示例:確定大O 77
22.4 分析算法的時間復雜度 81
22.4.1 分析二分查找算法 81
22.4.2 分析選擇排序算法 81
22.4.3 分析漢諾塔問題 81
22.4.4 常用的遞推關系 82
22.4.5 比較常用的增長函數 82
22.5 使用動態編程計算斐波那契數 83
22.6 使用歐幾里得算法求最大公約數 85
22.7 尋找素數的高效算法 89
22.8 使用分而治之法尋找最近的點對 94
22.9 使用回溯法解決八皇后問題 97
22.10 計算幾何:尋找凸包 99
22.10.1 卷包裹算法 100
22.10.2 格雷厄姆算法 101
關鍵術語 102
本章小結 102
測試題 103
編程練習題 103
第23章 排序 109
23.1 引言 109
23.2 插入排序 110
23.3 冒泡排序 112
23.4 歸并排序 114
23.5 快速排序 117
23.6 堆排序 121
23.6.1 堆的存儲 122
23.6.2 添加一個新的結點 122
23.6.3 刪除根結點 123
23.6.4 Heap類 124
23.6.5 使用Heap類進行排序 126
23.6.6 堆排序的時間復雜度 127
23.7 桶排序和基數排序 128
23.8 外部排序 129
23.8.1 實現階段Ⅰ 131
23.8.2 實現階段Ⅱ 132
23.8.3 結合兩個階段 133
23.8.4 外部排序復雜度 136
關鍵術語 136
本章小結 136
測試題 137
編程練習題 137
第24章 實現線性表、棧、隊列和優先隊列 141
24.1 引言 141
24.2 線性表的通用特性 141
24.3 數組線性表 144
24.4 鏈表 151
24.4.1 結點 151
24.4.2 MyLinkedList類 153
24.4.3 實現MyLinkedList 154
24.4.4 MyArrayList和MyLinkedList 162
24.4.5 鏈表的變體 162
24.5 棧和隊列 163
24.6 優先隊列 167
本章小結 168
測試題 169
編程練習題 169
第25章 二叉查找樹 171
25.1 引言 171
25.2 二叉查找樹 171
25.2.1 表示二叉查找樹 172
25.2.2 查找一個元素 173
25.2.3 在BST中插入一個元素 173
25.2.4 樹的遍歷 174
25.2.5 BST類 176
25.3 刪除BST中的一個元素 184
25.4 樹的可視化和MVC 189
25.5 迭代器 192
25.6 示例學習:數據壓縮 194
關鍵術語 199
本章小結 199
測試題 199
編程練習題 199
第26章 AVL樹 203
26.1 引言 203
26.2 重新平衡樹 204
26.3 為AVL樹設計類 205
26.4 重寫insert方法 207
26.5 實現旋轉 207
26.6 實現delete方法 208
26.7 AVLTree類 209
26.8 測試 AVLTree類 214
26.9 AVL樹的時間復雜度分析 216
關鍵術語 217
本章小結 217
測試題 217
編程練習題 217
第27章 散列 219
27.1 引言 219
27.2 什么是散列 219
27.3 散列函數和散列碼 220
27.3.1 基本數據類型的散列碼 220
27.3.2 字符串類型的散列碼 221
27.3.3 壓縮散列碼 221
27.4 使用開放地址法處理沖突 222
27.4.1 線性探測 222
27.4.2 二次探測法 223
27.4.3 再哈希法 224
27.5 使用鏈地址法處理沖突 225
27.6 裝填因子和再散列 226
27.7 使用散列實現映射表 227
27.8 使用散列實現集合 235
關鍵術語 241
本章小結 242
測試題 242
編程練習題 242
第28章 圖及其應用 244
28.1 引言 244
28.2 基本的圖術語 245
28.3 表示圖 247
28.3.1 表示頂點 247
28.3.2 表示邊:邊數組 248
28.3.3 表示邊:Edge對象 248
28.3.4 表示邊:鄰接矩陣 249
28.3.5 表示邊:鄰接線性表 249
28.4 圖建模 251
28.5 圖的可視化 261
28.6 圖的遍歷 263
28.7 深度優先搜索(DFS) 264
28.7.1 DFS的算法 264
28.7.2 DFS的實現 265
28.7.3 DFS的應用 267
28.8 示例學習:連通圓問題 268
28.9 廣度優先搜索(BFS) 270
28.9.1 BFS的算法 270
28.9.2 BFS的實現 271
28.9.3 BFS的應用 272
28.10 示例學習:9枚硬幣反面問題 273
關鍵術語 278
本章小結 278
測試題 278
編程練習題 278
第29章 加權圖及其應用 283
29.1 引言 283
29.2 加權圖的表示 284
29.2.1 加權邊的表示:邊數組 284
29.2.2 加權鄰接矩陣 285
29.2.3 鄰接線性表 285
29.3 WeightedGraph類 286
29.4 最小生成樹 292
29.4.1 最小生成樹算法 293
29.4.2 完善Prim的MST算法 295
29.4.3 MST算法的實現 295
29.5 尋找最短路徑 298
29.6 示例學習:加權的9枚硬幣反面問題 305
關鍵術語 308
本章小結 308
測試題 309
編程練習題 309
第30章 多線程和并行程序設計 314
30.1 引言 314
30.2 線程的概念 314
30.3 創建任務和線程 315
30.4 Thread類 318
30.5 示例學習:閃爍的文本 320
30.6 線程池 322
30.7 線程同步 324
30.7.1 synchronized關鍵字 326
30.7.2 同步語句 327
30.8 利用加鎖同步 327
30.9 線程間協作 329
30.10 示例學習:生產者/消費者 333
30.11 阻塞隊列 336
30.12 信號量 338
30.13 避免死鎖 339
30.14 線程狀態 340
30.15 同步合集 341
30.16 并行編程 342
關鍵術語 346
本章小結 346
測試題 347
編程練習題 347
第31章 網絡 350
31.1 引言 350
31.2 客戶端/服務器計算 351
31.2.1 服務器套接字 351
31.2.2 客戶端套接字 351
31.2.3 通過套接字進行數據傳輸 352
31.2.4 客戶端/服務器示例 353
31.3 InetAddress類 357
31.4 服務多個客戶 358
31.5 發送和接收對象 361
31.6 示例學習:分布式井字游戲 365
關鍵術語 376
本章小結 376
測試題 376
編程練習題 376
第32章 Java數據庫程序設計 379
32.1 引言 379
32.2 關系型數據庫系統 379
32.2.1 關系結構 380
32.2.2 完整性約束 381
32.3 SQL 383
32.3.1 在MySQL上創建用戶賬戶 383
32.3.2 創建數據庫 384
32.3.3 創建和刪除表 385
32.3.4 簡單插入、更新和刪除 386
32.3.5 簡單查詢 387
32.3.6 比較運算符和布爾運算符 387
32.3.7 操作符like、between-and和is null 388
32.3.8 列的別名 388
32.3.9 算術運算符 389
32.3.10 顯示互不相同的記錄 389
32.3.11 顯示排好序的記錄 390
32.3.12 聯結表 390
32.4 JDBC 391
32.4.1 使用JDBC開發數據庫應用程序 392
32.4.2 從JavaFX訪問數據庫 396
32.5 PreparedStatement 398
32.6 CallableStatement 400
32.7 獲取元數據 403
32.7.1 數據庫元數據 403
32.7.2 獲取數據庫表 404
32.7.3 結果集元數據 405
關鍵術語 406
本章小結 406
測試題 407
編程練習題 407
第33章 JavaServer Faces 411
33.1 引言 411
33.2 開始使用JSF 411
33.2.1 創建一個JSF項目 412
33.2.2 一個基本的JSF頁面 412
33.2.3 JSF的受管JavaBean 414
33.2.4 JSF表達式 416
33.3 JSF GUI組件 418
33.4 處理表單 421
33.5 示例學習:計算器 425
33.6 會話跟蹤 428
33.7 驗證輸入 430
33.8 將數據庫與facelet綁定 434
33.9 打開一個新的JSF頁面 439
關鍵術語 445
本章小結 445
測試題 445
編程練習題 446
附錄A Java關鍵字 451
附錄B ASCII字符集 452
附錄C 操作符優先級表 453
附錄D Java修飾符 454
附錄E 特殊浮點值 455
附錄F 數系 456
附錄G 位操作 460
附錄H 正則表達式 461
附錄I 枚舉類型 465